Add polarity-invert processor
[ardour.git] / libs / ardour / ardour / session.h
1 /*
2   Copyright (C) 2000 Paul Davis
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2 of the License, or
7   (at your option) any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software
16   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_session_h__
21 #define __ardour_session_h__
22
23 #include "libardour-config.h"
24
25 #include <exception>
26 #include <list>
27 #include <map>
28 #include <set>
29 #include <string>
30 #include <vector>
31 #include <queue>
32 #include <stdint.h>
33
34 #include <boost/dynamic_bitset.hpp>
35 #include <boost/scoped_ptr.hpp>
36 #include <boost/weak_ptr.hpp>
37 #include <boost/utility.hpp>
38
39 #include <glibmm/threads.h>
40
41 #include <ltc.h>
42
43 #include "pbd/error.h"
44 #include "pbd/event_loop.h"
45 #include "pbd/file_archive.h"
46 #include "pbd/rcu.h"
47 #include "pbd/reallocpool.h"
48 #include "pbd/statefuldestructible.h"
49 #include "pbd/signals.h"
50 #include "pbd/undo.h"
51
52 #include "lua/luastate.h"
53
54 #include "evoral/Range.hpp"
55
56 #include "midi++/types.h"
57 #include "midi++/mmc.h"
58
59 #include "temporal/time.h"
60
61 #include "ardour/ardour.h"
62 #include "ardour/chan_count.h"
63 #include "ardour/delivery.h"
64 #include "ardour/interthread_info.h"
65 #include "ardour/luascripting.h"
66 #include "ardour/location.h"
67 #include "ardour/monitor_processor.h"
68 #include "ardour/presentation_info.h"
69 #include "ardour/rc_configuration.h"
70 #include "ardour/session_configuration.h"
71 #include "ardour/session_event.h"
72 #include "ardour/interpolation.h"
73 #include "ardour/plugin.h"
74 #include "ardour/presentation_info.h"
75 #include "ardour/route.h"
76 #include "ardour/route_graph.h"
77
78
79 class XMLTree;
80 class XMLNode;
81 struct _AEffect;
82 typedef struct _AEffect AEffect;
83
84 namespace MIDI {
85 class Port;
86 class MachineControl;
87 class Parser;
88 }
89
90 namespace PBD {
91 class Controllable;
92 }
93
94 namespace luabridge {
95         class LuaRef;
96 }
97
98 namespace Evoral {
99 class Curve;
100 }
101
102 namespace ARDOUR {
103
104 class Amp;
105 class AudioEngine;
106 class AudioFileSource;
107 class AudioRegion;
108 class AudioSource;
109 class AudioTrack;
110 class Auditioner;
111 class AutomationList;
112 class AuxInput;
113 class BufferSet;
114 class Bundle;
115 class Butler;
116 class Click;
117 class ControllableDescriptor;
118 class CoreSelection;
119 class ExportHandler;
120 class ExportStatus;
121 class Graph;
122 class IO;
123 class IOProcessor;
124 class ImportStatus;
125 class MidiClockTicker;
126 class MidiControlUI;
127 class MidiPortManager;
128 class MidiPort;
129 class MidiRegion;
130 class MidiSource;
131 class MidiTrack;
132 class Playlist;
133 class PluginInsert;
134 class PluginInfo;
135 class Port;
136 class PortInsert;
137 class ProcessThread;
138 class Progress;
139 class Processor;
140 class Region;
141 class Return;
142 class Route;
143 class RouteGroup;
144 class RTTaskList;
145 class SMFSource;
146 class Send;
147 class SceneChanger;
148 class SessionDirectory;
149 class SessionMetadata;
150 class SessionPlaylists;
151 class Slave;
152 class Source;
153 class Speakers;
154 class TempoMap;
155 class Track;
156 class VCAManager;
157 class WindowsVSTPlugin;
158
159 extern void setup_enum_writer ();
160
161 class LIBARDOUR_API SessionException: public std::exception {
162 public:
163         explicit SessionException(const std::string msg) : _message(msg) {}
164         virtual ~SessionException() throw() {}
165
166         virtual const char* what() const throw() { return _message.c_str(); }
167
168 private:
169         std::string _message;
170 };
171
172 /** Ardour Session */
173 class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
174 {
175 private:
176         enum SubState {
177                 PendingDeclickIn      = 0x1,  ///< pending de-click fade-in for start
178                 PendingDeclickOut     = 0x2,  ///< pending de-click fade-out for stop
179                 StopPendingCapture    = 0x4,
180                 PendingLoopDeclickIn  = 0x8,  ///< pending de-click fade-in at the start of a loop
181                 PendingLoopDeclickOut = 0x10, ///< pending de-click fade-out at the end of a loop
182                 PendingLocate         = 0x20,
183         };
184
185 public:
186         enum RecordState {
187                 Disabled = 0,
188                 Enabled = 1,
189                 Recording = 2
190         };
191
192         /* a new session might have non-empty mix_template, an existing session should always have an empty one.
193            the bus profile can be null if no master out bus is required.
194         */
195
196         Session (AudioEngine&,
197                  const std::string& fullpath,
198                  const std::string& snapshot_name,
199                  BusProfile* bus_profile = 0,
200                  std::string mix_template = "");
201
202         virtual ~Session ();
203
204         static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format, std::string& program_version);
205         static std::string get_snapshot_from_instant (const std::string& session_dir);
206
207         /** a monotonic counter used for naming user-visible things uniquely
208          * (curently the sidechain port).
209          * Use sparingly to keep the numbers low, prefer PBD::ID for all
210          * internal, not user-visible IDs */
211         static unsigned int next_name_id ();
212
213         std::string path() const { return _path; }
214         std::string name() const { return _name; }
215         std::string snap_name() const { return _current_snapshot_name; }
216         std::string raid_path () const;
217         bool path_is_within_session (const std::string&);
218
219         bool writable() const { return _writable; }
220         void set_dirty ();
221         void set_clean ();
222         bool dirty() const { return _state_of_the_state & Dirty; }
223         void set_deletion_in_progress ();
224         void clear_deletion_in_progress ();
225         bool reconnection_in_progress() const { return _reconnecting_routes_in_progress; }
226         bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
227         bool routes_deletion_in_progress() const { return _route_deletion_in_progress; }
228         bool peaks_cleanup_in_progres() const { return _state_of_the_state & PeakCleanup; }
229         bool loading () const { return _state_of_the_state & Loading; }
230
231         PBD::Signal0<void> DirtyChanged;
232
233         const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
234
235         static PBD::Signal1<void,std::string> Dialog;
236
237         PBD::Signal0<void> BatchUpdateStart;
238         PBD::Signal0<void> BatchUpdateEnd;
239
240         int ensure_subdirs ();
241
242         std::string automation_dir () const;  ///< Automation data
243         std::string analysis_dir () const;    ///< Analysis data
244         std::string plugins_dir () const;     ///< Plugin state
245         std::string externals_dir () const;   ///< Links to external files
246
247         std::string construct_peak_filepath (const std::string& audio_path, const bool in_session = false, const bool old_peak_name = false) const;
248
249         bool audio_source_name_is_unique (const std::string& name);
250         std::string format_audio_source_name (const std::string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists);
251         std::string new_audio_source_path_for_embedded (const std::string& existing_path);
252         std::string new_audio_source_path (const std::string&, uint32_t nchans, uint32_t chan, bool destructive, bool take_required);
253         std::string new_midi_source_path (const std::string&, bool need_source_lock = true);
254         /** create a new track or bus from a template (XML path)
255          * @param how_many how many tracks or busses to create
256          * @param template_path path to xml template file
257          * @param name name (prefix) of the route to create
258          * @param pd Playlist disposition
259          * @return list of newly created routes
260          */
261         RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
262         RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
263         std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path,
264                                                             uint32_t channels, std::vector<std::string> const & smf_track_names);
265
266         int bring_all_sources_into_session (boost::function<void(uint32_t,uint32_t,std::string)> callback);
267
268         void process (pframes_t nframes);
269
270         BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
271         BufferSet& get_noinplace_buffers (ChanCount count = ChanCount::ZERO);
272         BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
273         BufferSet& get_route_buffers (ChanCount count = ChanCount::ZERO, bool silence = true);
274         BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
275
276         bool have_rec_enabled_track () const;
277     bool have_rec_disabled_track () const;
278
279         bool have_captured() const { return _have_captured; }
280
281         void refill_all_track_buffers ();
282         Butler* butler() { return _butler; }
283         void butler_transport_work ();
284
285         void refresh_disk_space ();
286
287         int load_routes (const XMLNode&, int);
288         boost::shared_ptr<RouteList> get_routes() const {
289                 return routes.reader ();
290         }
291
292         boost::shared_ptr<RTTaskList> rt_tasklist () { return _rt_tasklist; }
293
294         CoreSelection& selection () { return *_selection; }
295
296         /* because the set of Stripables consists of objects managed
297          * independently, in multiple containers within the Session (or objects
298          * owned by the session), we fill out a list in-place rather than
299          * return a pointer to a copy of the (RCU) managed list, as happens
300          * with get_routes()
301          */
302
303         void get_stripables (StripableList&) const;
304         StripableList get_stripables () const;
305         boost::shared_ptr<RouteList> get_tracks() const;
306         boost::shared_ptr<RouteList> get_routes_with_internal_returns() const;
307         boost::shared_ptr<RouteList> get_routes_with_regions_at (samplepos_t const) const;
308
309         uint32_t nstripables (bool with_monitor = false) const;
310         uint32_t nroutes() const { return routes.reader()->size(); }
311         uint32_t ntracks () const;
312         uint32_t nbusses () const;
313
314         boost::shared_ptr<BundleList> bundles () {
315                 return _bundles.reader ();
316         }
317
318         void notify_presentation_info_change ();
319
320         template<class T> void foreach_route (T *obj, void (T::*func)(Route&), bool sort = true);
321         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>), bool sort = true);
322         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg, bool sort = true);
323
324         static char session_name_is_legal (const std::string&);
325         bool io_name_is_legal (const std::string&) const;
326         boost::shared_ptr<Route> route_by_name (std::string) const;
327         boost::shared_ptr<Route> route_by_id (PBD::ID) const;
328         boost::shared_ptr<Stripable> stripable_by_id (PBD::ID) const;
329         boost::shared_ptr<Stripable> get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag) const;
330         boost::shared_ptr<Route> get_remote_nth_route (PresentationInfo::order_t n) const;
331         boost::shared_ptr<Route> route_by_selected_count (uint32_t cnt) const;
332         void routes_using_input_from (const std::string& str, RouteList& rl);
333
334         bool route_name_unique (std::string) const;
335         bool route_name_internal (std::string) const;
336
337         uint32_t track_number_decimals () const {
338                 return _track_number_decimals;
339         }
340
341         bool get_record_enabled() const {
342                 return (record_status () >= Enabled);
343         }
344
345         RecordState record_status() const {
346                 return (RecordState) g_atomic_int_get (&_record_status);
347         }
348
349         bool actively_recording () const {
350                 return record_status() == Recording;
351         }
352
353         bool record_enabling_legal () const;
354         void maybe_enable_record (bool rt_context = false);
355         void disable_record (bool rt_context, bool force = false);
356         void step_back_from_record ();
357
358         void set_all_tracks_record_enabled(bool);
359
360         void maybe_write_autosave ();
361
362         /* Emitted when all i/o connections are complete */
363
364         PBD::Signal0<void> IOConnectionsComplete;
365
366         /* Timecode status signals */
367         PBD::Signal1<void, bool> MTCSyncStateChanged;
368         PBD::Signal1<void, bool> LTCSyncStateChanged;
369
370         /* Record status signals */
371
372         PBD::Signal0<void> RecordStateChanged; /* signals changes in recording state (i.e. are we recording) */
373         /* XXX may 2015: paul says: it isn't clear to me that this has semantics that cannot be inferrred
374            from the previous signal and session state.
375         */
376         PBD::Signal0<void> RecordArmStateChanged; /* signals changes in recording arming */
377
378         /* Emited when session is loaded */
379         PBD::Signal0<void> SessionLoaded;
380
381         /* Transport mechanism signals */
382
383         /** Emitted on the following changes in transport state:
384          *  - stop (from the butler thread)
385          *  - change in whether or not we are looping (from the process thread)
386          *  - change in the play range (from the process thread)
387          *  - start (from the process thread)
388          *  - engine halted
389          */
390         PBD::Signal0<void> TransportStateChange;
391
392         PBD::Signal1<void,samplepos_t> PositionChanged; /* sent after any non-sequential motion */
393         PBD::Signal1<void,samplepos_t> Xrun;
394         PBD::Signal0<void> TransportLooped;
395
396         /** emitted when a locate has occurred */
397         PBD::Signal0<void> Located;
398
399         PBD::Signal1<void,RouteList&> RouteAdded;
400         /** Emitted when a property of one of our route groups changes.
401          *  The parameter is the RouteGroup that has changed.
402          */
403         PBD::Signal1<void, RouteGroup *> RouteGroupPropertyChanged;
404         /** Emitted when a route is added to one of our route groups.
405          *  First parameter is the RouteGroup, second is the route.
406          */
407         PBD::Signal2<void, RouteGroup *, boost::weak_ptr<Route> > RouteAddedToRouteGroup;
408         /** Emitted when a route is removed from one of our route groups.
409          *  First parameter is the RouteGroup, second is the route.
410          */
411         PBD::Signal2<void, RouteGroup *, boost::weak_ptr<Route> > RouteRemovedFromRouteGroup;
412
413         /* Step Editing status changed */
414         PBD::Signal1<void,bool> StepEditStatusChange;
415
416         /* Timecode state signals */
417         PBD::Signal0<void> MtcOrLtcInputPortChanged;
418
419         void queue_event (SessionEvent*);
420
421         void request_roll_at_and_return (samplepos_t start, samplepos_t return_to);
422         void request_bounded_roll (samplepos_t start, samplepos_t end);
423         void request_stop (bool abort = false, bool clear_state = false);
424         void request_locate (samplepos_t sample, bool with_roll = false);
425
426         void request_play_loop (bool yn, bool leave_rolling = false);
427         bool get_play_loop () const { return play_loop; }
428
429         samplepos_t last_transport_start () const { return _last_roll_location; }
430         void goto_end ();
431         void goto_start (bool and_roll = false);
432         void use_rf_shuttle_speed ();
433         void allow_auto_play (bool yn);
434         void request_transport_speed (double speed, bool as_default = true);
435         void request_transport_speed_nonzero (double, bool as_default = true);
436         void request_overwrite_buffer (boost::shared_ptr<Route>);
437         void adjust_playback_buffering();
438         void adjust_capture_buffering();
439
440         bool global_locate_pending() const { return _global_locate_pending; }
441         bool locate_pending() const { return static_cast<bool>(post_transport_work()&PostTransportLocate); }
442         bool declick_out_pending() const { return static_cast<bool>(transport_sub_state&(PendingDeclickOut)); }
443         bool transport_locked () const;
444
445         int wipe ();
446
447         samplepos_t current_end_sample () const;
448         samplepos_t current_start_sample () const;
449         /** "actual" sample rate of session, set by current audioengine rate, pullup/down etc. */
450         samplecnt_t sample_rate () const { return _current_sample_rate; }
451         /** "native" sample rate of session, regardless of current audioengine rate, pullup/down etc */
452         samplecnt_t nominal_sample_rate () const { return _nominal_sample_rate; }
453         samplecnt_t frames_per_hour () const { return _frames_per_hour; }
454
455         double samples_per_timecode_frame() const { return _samples_per_timecode_frame; }
456         samplecnt_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
457
458         MIDI::byte get_mtc_timecode_bits() const {
459                 return mtc_timecode_bits;   /* encoding of SMTPE type for MTC */
460         }
461
462         double timecode_frames_per_second() const;
463         bool timecode_drop_frames() const;
464
465         /* Locations */
466
467         Locations *locations() { return _locations; }
468
469         PBD::Signal1<void,Location*>    auto_loop_location_changed;
470         PBD::Signal1<void,Location*>    auto_punch_location_changed;
471         PBD::Signal0<void>              locations_modified;
472
473         void set_auto_punch_location (Location *);
474         void set_auto_loop_location (Location *);
475         void set_session_extents (samplepos_t start, samplepos_t end);
476         bool end_is_free () const { return _session_range_end_is_free; }
477         void set_end_is_free (bool);
478         int location_name(std::string& result, std::string base = std::string(""));
479
480         pframes_t get_block_size () const         { return current_block_size; }
481         samplecnt_t worst_output_latency () const { return _worst_output_latency; }
482         samplecnt_t worst_input_latency () const  { return _worst_input_latency; }
483         samplecnt_t worst_route_latency () const  { return _worst_route_latency; }
484         samplecnt_t worst_latency_preroll () const;
485
486         struct SaveAs {
487                 std::string new_parent_folder;  /* parent folder where new session folder will be created */
488                 std::string new_name;           /* name of newly saved session */
489                 bool        switch_to;     /* true if we should be working on newly saved session after save-as; false otherwise */
490                 bool        include_media; /* true if the newly saved session should contain references to media */
491                 bool        copy_media;    /* true if media files (audio, media, etc) should be copied into newly saved session; false otherwise */
492                 bool        copy_external; /* true if external media should be consolidated into the newly saved session; false otherwise */
493
494                 std::string final_session_folder_name; /* filled in by * Session::save_as(), provides full path to newly saved session */
495
496                 /* emitted as we make progress. 3 arguments passed to signal
497                  * handler:
498                  *
499                  *  1: percentage complete measured as a fraction (0-1.0) of
500                  *     total data copying done.
501                  *  2: number of files copied so far
502                  *  3: total number of files to copy
503                  *
504                  * Handler should return true for save-as to continue, or false
505                  * to stop (and remove all evidence of partial save-as).
506                  */
507                 PBD::Signal3<bool,float,int64_t,int64_t> Progress;
508
509                 /* if save_as() returns non-zero, this string will indicate the reason why.
510                  */
511                 std::string failure_message;
512         };
513
514         int save_as (SaveAs&);
515
516         /** save session
517          * @param snapshot_name name of the session (use an empty string for the current name)
518          * @param pending save a 'recovery', not full state (default: false)
519          * @param switch_to_snapshot switch to given snapshot after saving (default: false)
520          * @param template_only save a session template (default: false)
521          * @return zero on success
522          */
523         int save_state (std::string snapshot_name,
524                         bool pending = false,
525                         bool switch_to_snapshot = false,
526                         bool template_only = false,
527                         bool for_archive = false,
528                         bool only_used_assets = false);
529
530         enum ArchiveEncode {
531                 NO_ENCODE,
532                 FLAC_16BIT,
533                 FLAC_24BIT
534         };
535
536         int archive_session (const std::string&, const std::string&,
537                              ArchiveEncode compress_audio = FLAC_16BIT,
538                              PBD::FileArchive::CompressionLevel compression_level = PBD::FileArchive::CompressGood,
539                              bool only_used_sources = false,
540                              Progress* p = 0);
541
542         int restore_state (std::string snapshot_name);
543         int save_template (const std::string& template_name, const std::string& description = "", bool replace_existing = false);
544         int save_history (std::string snapshot_name = "");
545         int restore_history (std::string snapshot_name);
546         void remove_state (std::string snapshot_name);
547         void rename_state (std::string old_name, std::string new_name);
548         void remove_pending_capture_state ();
549         int rename (const std::string&);
550         bool get_nsm_state () const { return _under_nsm_control; }
551         void set_nsm_state (bool state) { _under_nsm_control = state; }
552         bool save_default_options ();
553
554         PBD::Signal1<void,std::string> StateSaved;
555         PBD::Signal0<void> StateReady;
556
557         /* emitted when session needs to be saved due to some internal
558          * event or condition (i.e. not in response to a user request).
559          *
560          * Only one object should
561          * connect to this signal and take responsibility.
562          *
563          * Argument is the snapshot name to use when saving.
564          */
565         PBD::Signal1<void,std::string> SaveSessionRequested;
566
567         /* emitted during a session save to allow other entities to add state, via
568          * extra XML, to the session state
569          */
570         PBD::Signal0<void> SessionSaveUnderway;
571
572         std::vector<std::string> possible_states() const;
573         static std::vector<std::string> possible_states (std::string path);
574
575         bool export_track_state (boost::shared_ptr<RouteList> rl, const std::string& path);
576
577         /// The instant xml file is written to the session directory
578         void add_instant_xml (XMLNode&, bool write_to_config = true);
579         XMLNode* instant_xml (const std::string& str);
580
581         enum StateOfTheState {
582                 Clean = 0x0,
583                 Dirty = 0x1,
584                 CannotSave = 0x2,
585                 Deletion = 0x4,
586                 InitialConnecting = 0x8,
587                 Loading = 0x10,
588                 InCleanup = 0x20,
589                 PeakCleanup = 0x40
590         };
591
592         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
593
594         class StateProtector {
595                 public:
596                         StateProtector (Session* s) : _session (s) {
597                                 g_atomic_int_inc (&s->_suspend_save);
598                         }
599                         ~StateProtector () {
600                                 if (g_atomic_int_dec_and_test (&_session->_suspend_save)) {
601                                         while (_session->_save_queued) {
602                                                 _session->_save_queued = false;
603                                                 _session->save_state ("");
604                                         }
605                                 }
606                         }
607                 private:
608                         Session * _session;
609         };
610
611         class ProcessorChangeBlocker {
612                 public:
613                         ProcessorChangeBlocker (Session* s, bool rc = true)
614                                 : _session (s)
615                                 , _reconfigure_on_delete (rc)
616                         {
617                                 g_atomic_int_inc (&s->_ignore_route_processor_changes);
618                         }
619                         ~ProcessorChangeBlocker () {
620                                 if (g_atomic_int_dec_and_test (&_session->_ignore_route_processor_changes)) {
621                                         if (_reconfigure_on_delete) {
622                                                 _session->route_processors_changed (RouteProcessorChange ());
623                                         }
624                                 }
625                         }
626                 private:
627                         Session* _session;
628                         bool _reconfigure_on_delete;
629         };
630
631         RouteGroup* new_route_group (const std::string&);
632         void add_route_group (RouteGroup *);
633         void remove_route_group (RouteGroup* rg) { if (rg) remove_route_group (*rg); }
634         void remove_route_group (RouteGroup&);
635         void reorder_route_groups (std::list<RouteGroup*>);
636
637         RouteGroup* route_group_by_name (std::string);
638         RouteGroup& all_route_group() const;
639
640         PBD::Signal1<void,RouteGroup*> route_group_added;
641         PBD::Signal0<void>             route_group_removed;
642         PBD::Signal0<void>             route_groups_reordered;
643
644         void foreach_route_group (boost::function<void(RouteGroup*)> f) {
645                 for (std::list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
646                         f (*i);
647                 }
648         }
649
650         std::list<RouteGroup*> const & route_groups () const {
651                 return _route_groups;
652         }
653
654         /* fundamental operations. duh. */
655
656         std::list<boost::shared_ptr<AudioTrack> > new_audio_track (
657                 int input_channels,
658                 int output_channels,
659                 RouteGroup* route_group,
660                 uint32_t how_many,
661                 std::string name_template,
662                 PresentationInfo::order_t order,
663                 TrackMode mode = Normal
664                 );
665
666         std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
667                 const ChanCount& input, const ChanCount& output, bool strict_io,
668                 boost::shared_ptr<PluginInfo> instrument,
669                 Plugin::PresetRecord* pset,
670                 RouteGroup* route_group, uint32_t how_many, std::string name_template,
671                 PresentationInfo::order_t,
672                 TrackMode mode = Normal
673                 );
674
675         RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template, PresentationInfo::Flag, PresentationInfo::order_t);
676         RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template, bool strict_io, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord*, PresentationInfo::Flag, PresentationInfo::order_t);
677
678         void remove_routes (boost::shared_ptr<RouteList>);
679         void remove_route (boost::shared_ptr<Route>);
680
681         void resort_routes ();
682         void resort_routes_using (boost::shared_ptr<RouteList>);
683
684         AudioEngine & engine() { return _engine; }
685         AudioEngine const & engine () const { return _engine; }
686
687         static std::string default_track_name_pattern (DataType);
688
689         /* Time */
690
691         samplepos_t transport_sample () const { return _transport_sample; }
692         samplepos_t record_location () const { return _last_record_location; }
693         samplepos_t audible_sample (bool* latent_locate = NULL) const;
694         samplepos_t requested_return_sample() const { return _requested_return_sample; }
695         void set_requested_return_sample(samplepos_t return_to);
696
697         samplecnt_t remaining_latency_preroll () const { return _remaining_latency_preroll; }
698
699         enum PullupFormat {
700                 pullup_Plus4Plus1,
701                 pullup_Plus4,
702                 pullup_Plus4Minus1,
703                 pullup_Plus1,
704                 pullup_None,
705                 pullup_Minus1,
706                 pullup_Minus4Plus1,
707                 pullup_Minus4,
708                 pullup_Minus4Minus1
709         };
710
711         void sync_time_vars();
712
713         void bbt_time (samplepos_t when, Timecode::BBT_Time&);
714         void timecode_to_sample(Timecode::Time& timecode, samplepos_t& sample, bool use_offset, bool use_subframes) const;
715         void sample_to_timecode(samplepos_t sample, Timecode::Time& timecode, bool use_offset, bool use_subframes) const;
716         void timecode_time (Timecode::Time &);
717         void timecode_time (samplepos_t when, Timecode::Time&);
718         void timecode_time_subframes (samplepos_t when, Timecode::Time&);
719
720         void timecode_duration (samplecnt_t, Timecode::Time&) const;
721         void timecode_duration_string (char *, size_t len, samplecnt_t) const;
722
723         samplecnt_t convert_to_samples (AnyTime const & position);
724         samplecnt_t any_duration_to_samples (samplepos_t position, AnyTime const & duration);
725
726         static PBD::Signal1<void, samplepos_t> StartTimeChanged;
727         static PBD::Signal1<void, samplepos_t> EndTimeChanged;
728
729         void   request_sync_source (Slave*);
730         bool   synced_to_engine() const { return _slave && config.get_external_sync() && Config->get_sync_source() == Engine; }
731         bool   synced_to_mtc () const { return config.get_external_sync() && Config->get_sync_source() == MTC && g_atomic_int_get (const_cast<gint*>(&_mtc_active)); }
732         bool   synced_to_ltc () const { return config.get_external_sync() && Config->get_sync_source() == LTC && g_atomic_int_get (const_cast<gint*>(&_ltc_active)); }
733
734         double engine_speed() const { return _engine_speed; }
735         double actual_speed() const {
736                 if (_transport_speed > 0) return _engine_speed;
737                 if (_transport_speed < 0) return - _engine_speed;
738                 return 0;
739         }
740         double transport_speed() const { return _count_in_samples > 0 ? 0. : _transport_speed; }
741         bool   transport_stopped() const { return _transport_speed == 0.0; }
742         bool   transport_rolling() const { return _transport_speed != 0.0 && _count_in_samples == 0 && _remaining_latency_preroll == 0; }
743
744         bool silent () { return _silent; }
745
746         TempoMap&       tempo_map()       { return *_tempo_map; }
747         const TempoMap& tempo_map() const { return *_tempo_map; }
748
749         unsigned int    get_xrun_count () const {return _xrun_count; }
750         void            reset_xrun_count () {_xrun_count = 0; }
751
752         /* region info  */
753
754         boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>) const;
755
756         boost::shared_ptr<Region>      XMLRegionFactory (const XMLNode&, bool full);
757         boost::shared_ptr<AudioRegion> XMLAudioRegionFactory (const XMLNode&, bool full);
758         boost::shared_ptr<MidiRegion>  XMLMidiRegionFactory (const XMLNode&, bool full);
759
760         /* source management */
761
762         void import_files (ImportStatus&);
763         bool sample_rate_convert (ImportStatus&, std::string infile, std::string& outfile);
764         std::string build_tmp_convert_name (std::string file);
765
766         boost::shared_ptr<ExportHandler> get_export_handler ();
767         boost::shared_ptr<ExportStatus> get_export_status ();
768
769         int start_audio_export (samplepos_t position, bool realtime = false, bool region_export = false);
770
771         PBD::Signal1<int, samplecnt_t> ProcessExport;
772         static PBD::Signal2<void,std::string, std::string> Exported;
773
774         void add_source (boost::shared_ptr<Source>);
775         void remove_source (boost::weak_ptr<Source>);
776
777         void cleanup_regions();
778         bool can_cleanup_peakfiles () const;
779         int  cleanup_peakfiles ();
780         int  cleanup_sources (CleanupReport&);
781         int  cleanup_trash_sources (CleanupReport&);
782
783         int destroy_sources (std::list<boost::shared_ptr<Source> >);
784
785         int remove_last_capture ();
786
787         /** handlers should return 0 for "everything OK", and any other value for
788          * "cannot setup audioengine".
789          */
790         static PBD::Signal1<int,uint32_t> AudioEngineSetupRequired;
791
792         /** handlers should return -1 for "stop cleanup",
793             0 for "yes, delete this playlist",
794             1 for "no, don't delete this playlist".
795         */
796         static PBD::Signal1<int,boost::shared_ptr<Playlist> >  AskAboutPlaylistDeletion;
797
798         /** handlers should return 0 for "ignore the rate mismatch",
799             !0 for "do not use this session"
800         */
801         static PBD::Signal2<int, samplecnt_t, samplecnt_t> AskAboutSampleRateMismatch;
802
803         /** non interactive message */
804         static PBD::Signal2<void, samplecnt_t, samplecnt_t> NotifyAboutSampleRateMismatch;
805
806         /** handlers should return !0 for use pending state, 0 for ignore it.
807          */
808         static PBD::Signal0<int> AskAboutPendingState;
809
810         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (
811                 size_t, std::string const &, uint32_t, bool destructive);
812
813         boost::shared_ptr<MidiSource> create_midi_source_for_session (std::string const &);
814         boost::shared_ptr<MidiSource> create_midi_source_by_stealing_name (boost::shared_ptr<Track>);
815
816         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
817         boost::shared_ptr<AudioFileSource> audio_source_by_path_and_channel (const std::string&, uint16_t) const;
818         boost::shared_ptr<MidiSource> midi_source_by_path (const std::string&, bool need_source_lock) const;
819         uint32_t count_sources_by_origin (const std::string&);
820
821         void add_playlist (boost::shared_ptr<Playlist>, bool unused = false);
822
823         /* Curves and AutomationLists (TODO when they go away) */
824         void add_automation_list(AutomationList*);
825
826         /* auditioning */
827
828         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
829         void audition_playlist ();
830         void audition_region (boost::shared_ptr<Region>);
831         void cancel_audition ();
832         bool is_auditioning () const;
833
834         PBD::Signal1<void,bool> AuditionActive;
835
836         /* session script */
837         void register_lua_function (const std::string&, const std::string&, const LuaScriptParamList&);
838         void unregister_lua_function (const std::string& name);
839         std::vector<std::string> registered_lua_functions ();
840         uint32_t registered_lua_function_count () const { return _n_lua_scripts; }
841         void scripts_changed (); // called from lua, updates _n_lua_scripts
842
843         PBD::Signal0<void> LuaScriptsChanged;
844
845         /* flattening stuff */
846
847         boost::shared_ptr<Region> write_one_track (Track&, samplepos_t start, samplepos_t end,
848                                                    bool overwrite, std::vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot,
849                                                    boost::shared_ptr<Processor> endpoint,
850                                                    bool include_endpoint, bool for_export, bool for_freeze);
851         int freeze_all (InterThreadInfo&);
852
853         /* session-wide solo/mute/rec-enable */
854
855         bool muted() const;
856         std::vector<boost::weak_ptr<AutomationControl> > cancel_all_mute ();
857
858         bool soloing() const { return _non_soloed_outs_muted; }
859         bool listening() const { return _listen_cnt > 0; }
860         bool solo_isolated() const { return _solo_isolated_cnt > 0; }
861         void cancel_all_solo ();
862
863         static const SessionEvent::RTeventCallback rt_cleanup;
864
865         void clear_all_solo_state (boost::shared_ptr<RouteList>);
866
867         /* Control-based methods */
868
869         void set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition);
870         void set_control (boost::shared_ptr<AutomationControl>, double val, PBD::Controllable::GroupControlDisposition);
871
872         void set_exclusive_input_active (boost::shared_ptr<RouteList> rt, bool onoff, bool flip_others = false);
873
874         PBD::Signal1<void,bool> SoloActive;
875         PBD::Signal0<void> SoloChanged;
876         PBD::Signal0<void> MuteChanged;
877         PBD::Signal0<void> IsolatedChanged;
878         PBD::Signal0<void> MonitorChanged;
879
880         PBD::Signal0<void> session_routes_reconnected;
881
882         /* monitor/master out */
883         int add_master_bus (ChanCount const&);
884
885         void add_monitor_section ();
886         void reset_monitor_section ();
887         void remove_monitor_section ();
888         bool monitor_active() const { return (_monitor_out && _monitor_out->monitor_control () && _monitor_out->monitor_control ()->monitor_active()); }
889
890         boost::shared_ptr<Route> monitor_out() const { return _monitor_out; }
891         boost::shared_ptr<Route> master_out() const { return _master_out; }
892
893         PresentationInfo::order_t master_order_key () const { return _master_out ? _master_out->presentation_info ().order () : -1; }
894         bool ensure_stripable_sort_order ();
895
896         void globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool);
897         void globally_set_send_gains_from_track (boost::shared_ptr<Route> dest);
898         void globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest);
899         void globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest);
900         void add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders);
901         void add_internal_send (boost::shared_ptr<Route>, int, boost::shared_ptr<Route>);
902         void add_internal_send (boost::shared_ptr<Route>, boost::shared_ptr<Processor>, boost::shared_ptr<Route>);
903
904         static void set_disable_all_loaded_plugins (bool yn) {
905                 _disable_all_loaded_plugins = yn;
906         }
907         static bool get_disable_all_loaded_plugins() {
908                 return _disable_all_loaded_plugins;
909         }
910         static void set_bypass_all_loaded_plugins (bool yn) {
911                 _bypass_all_loaded_plugins = yn;
912         }
913         static bool get_bypass_all_loaded_plugins() {
914                 return _bypass_all_loaded_plugins;
915         }
916
917         uint32_t next_send_id();
918         uint32_t next_aux_send_id();
919         uint32_t next_return_id();
920         uint32_t next_insert_id();
921         void mark_send_id (uint32_t);
922         void mark_aux_send_id (uint32_t);
923         void mark_return_id (uint32_t);
924         void mark_insert_id (uint32_t);
925         void unmark_send_id (uint32_t);
926         void unmark_aux_send_id (uint32_t);
927         void unmark_return_id (uint32_t);
928         void unmark_insert_id (uint32_t);
929
930         /* s/w "RAID" management */
931
932         boost::optional<samplecnt_t> available_capture_duration();
933
934         /* I/O bundles */
935
936         void add_bundle (boost::shared_ptr<Bundle>, bool emit_signal = true);
937         void remove_bundle (boost::shared_ptr<Bundle>);
938         boost::shared_ptr<Bundle> bundle_by_name (std::string) const;
939
940         PBD::Signal0<void> BundleAddedOrRemoved;
941
942         void midi_panic ();
943
944         /* History (for editors, mixers, UIs etc.) */
945
946         /** Undo some transactions.
947          * @param n Number of transactions to undo.
948          */
949         void undo (uint32_t n);
950         /** Redo some transactions.
951          * @param n Number of transactions to undo.
952          */
953         void redo (uint32_t n);
954
955         UndoHistory& history() { return _history; }
956
957         uint32_t undo_depth() const { return _history.undo_depth(); }
958         uint32_t redo_depth() const { return _history.redo_depth(); }
959         std::string next_undo() const { return _history.next_undo(); }
960         std::string next_redo() const { return _history.next_redo(); }
961
962         /** begin collecting undo information
963          *
964          * This call must always be followed by either
965          * begin_reversible_command() or commit_reversible_command()
966          *
967          * @param cmd_name human readable name for the undo operation
968          */
969         void begin_reversible_command (const std::string& cmd_name);
970         void begin_reversible_command (GQuark);
971         /** abort an open undo command
972          * This must only be called after begin_reversible_command ()
973          */
974         void abort_reversible_command ();
975         /** finalize an undo command and commit pending transactions
976          *
977          * This must only be called after begin_reversible_command ()
978          * @param cmd (additional) command to add
979          */
980         void commit_reversible_command (Command* cmd = 0);
981
982         void add_command (Command *const cmd);
983
984         /** create an StatefulDiffCommand from the given object and add it to the stack.
985          *
986          * This function must only be called after  begin_reversible_command.
987          * Failing to do so may lead to a crash.
988          *
989          * @param sfd the object to diff
990          * @returns the allocated StatefulDiffCommand (already added via add_command)
991          */
992         PBD::StatefulDiffCommand* add_stateful_diff_command (boost::shared_ptr<PBD::StatefulDestructible> sfd);
993
994         /** @return The list of operations that are currently in progress */
995         std::list<GQuark> const & current_operations () {
996                 return _current_trans_quarks;
997         }
998
999         bool operation_in_progress (GQuark) const;
1000
1001         void add_commands (std::vector<Command*> const & cmds);
1002
1003         std::map<PBD::ID,PBD::StatefulDestructible*> registry;
1004
1005         // these commands are implemented in libs/ardour/session_command.cc
1006         Command* memento_command_factory(XMLNode* n);
1007         Command* stateful_diff_command_factory (XMLNode *);
1008         void register_with_memento_command_factory(PBD::ID, PBD::StatefulDestructible*);
1009
1010         /* clicking */
1011
1012         boost::shared_ptr<IO> click_io() { return _click_io; }
1013         boost::shared_ptr<Amp> click_gain() { return _click_gain; }
1014
1015         /* disk, buffer loads */
1016
1017         uint32_t playback_load ();
1018         uint32_t capture_load ();
1019
1020         /* ranges */
1021
1022         void request_play_range (std::list<AudioRange>*, bool leave_rolling = false);
1023         void request_cancel_play_range ();
1024         bool get_play_range () const { return _play_range; }
1025
1026         void maybe_update_session_range (samplepos_t, samplepos_t);
1027
1028         /* preroll */
1029         samplecnt_t preroll_samples (samplepos_t) const;
1030
1031         void request_preroll_record_trim (samplepos_t start, samplecnt_t preroll);
1032         void request_count_in_record ();
1033
1034         samplecnt_t preroll_record_trim_len () const { return _preroll_record_trim_len; }
1035
1036         /* temporary hacks to allow selection to be pushed from GUI into backend.
1037            Whenever we move the selection object into libardour, these will go away.
1038          */
1039         void set_range_selection (samplepos_t start, samplepos_t end);
1040         void set_object_selection (samplepos_t start, samplepos_t end);
1041         void clear_range_selection ();
1042         void clear_object_selection ();
1043
1044         /* buffers for gain and pan */
1045
1046         gain_t* gain_automation_buffer () const;
1047         gain_t* trim_automation_buffer () const;
1048         gain_t* send_gain_automation_buffer () const;
1049         gain_t* scratch_automation_buffer () const;
1050         pan_t** pan_automation_buffer () const;
1051
1052         void ensure_buffer_set (BufferSet& buffers, const ChanCount& howmany);
1053
1054         /* VST support */
1055
1056         static int  vst_current_loading_id;
1057         static const char* vst_can_do_strings[];
1058         static const int vst_can_do_string_count;
1059
1060         static intptr_t vst_callback (
1061                 AEffect* effect,
1062                 int32_t opcode,
1063                 int32_t index,
1064                 intptr_t value,
1065                 void* ptr,
1066                 float opt
1067                 );
1068
1069         static PBD::Signal0<void> SendFeedback;
1070
1071         /* Speakers */
1072
1073         boost::shared_ptr<Speakers> get_speakers ();
1074
1075         /* Controllables */
1076
1077         boost::shared_ptr<Processor> processor_by_id (PBD::ID) const;
1078
1079         boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
1080         boost::shared_ptr<AutomationControl> automation_control_by_id (const PBD::ID&);
1081         boost::shared_ptr<PBD::Controllable> controllable_by_descriptor (const ARDOUR::ControllableDescriptor&);
1082
1083         void add_controllable (boost::shared_ptr<PBD::Controllable>);
1084         void remove_controllable (PBD::Controllable*);
1085
1086         boost::shared_ptr<PBD::Controllable> solo_cut_control() const;
1087
1088         SessionConfiguration config;
1089
1090         SessionConfiguration* cfg () { return &config; }
1091
1092         bool exporting () const {
1093                 return _exporting;
1094         }
1095
1096         bool bounce_processing() const {
1097                 return _bounce_processing_active;
1098         }
1099
1100         /* this is a private enum, but setup_enum_writer() needs it,
1101            and i can't find a way to give that function
1102            friend access. sigh.
1103         */
1104
1105         enum PostTransportWork {
1106                 PostTransportStop               = 0x1,
1107                 PostTransportDuration           = 0x2,
1108                 PostTransportLocate             = 0x4,
1109                 PostTransportRoll               = 0x8,
1110                 PostTransportAbort              = 0x10,
1111                 PostTransportOverWrite          = 0x20,
1112                 PostTransportSpeed              = 0x40,
1113                 PostTransportAudition           = 0x80,
1114                 PostTransportReverse            = 0x100,
1115                 PostTransportInputChange        = 0x200,
1116                 PostTransportCurveRealloc       = 0x400,
1117                 PostTransportClearSubstate      = 0x800,
1118                 PostTransportAdjustPlaybackBuffering  = 0x1000,
1119                 PostTransportAdjustCaptureBuffering   = 0x2000
1120         };
1121
1122         enum SlaveState {
1123                 Stopped,
1124                 Waiting,
1125                 Running
1126         };
1127
1128         SlaveState slave_state() const { return _slave_state; }
1129         Slave* slave() const { return _slave; }
1130
1131         boost::shared_ptr<SessionPlaylists> playlists;
1132
1133         void send_mmc_locate (samplepos_t);
1134         void queue_full_time_code () { _send_timecode_update = true; }
1135         void queue_song_position_pointer () { /* currently does nothing */ }
1136
1137         bool step_editing() const { return (_step_editors > 0); }
1138
1139         void request_suspend_timecode_transmission ();
1140         void request_resume_timecode_transmission ();
1141         bool timecode_transmission_suspended () const;
1142
1143         std::vector<std::string> source_search_path(DataType) const;
1144         void ensure_search_path_includes (const std::string& path, DataType type);
1145         void remove_dir_from_search_path (const std::string& path, DataType type);
1146
1147         std::list<std::string> unknown_processors () const;
1148
1149         /** Emitted when a feedback cycle has been detected within Ardour's signal
1150             processing path.  Until it is fixed (by the user) some (unspecified)
1151             routes will not be run.
1152         */
1153         static PBD::Signal0<void> FeedbackDetected;
1154
1155         /** Emitted when a graph sort has successfully completed, which means
1156             that it has no feedback cycles.
1157         */
1158         static PBD::Signal0<void> SuccessfulGraphSort;
1159
1160         /* handlers can return an integer value:
1161            0: config.set_audio_search_path() or config.set_midi_search_path() was used
1162            to modify the search path and we should try to find it again.
1163            1: quit entire session load
1164            2: as 0, but don't ask about other missing files
1165            3: don't ask about other missing files, and just mark this one missing
1166            -1: just mark this one missing
1167            any other value: as -1
1168         */
1169         static PBD::Signal3<int,Session*,std::string,DataType> MissingFile;
1170
1171         void set_missing_file_replacement (const std::string& mfr) {
1172                 _missing_file_replacement = mfr;
1173         }
1174
1175         /** Emitted when the session wants Ardour to quit */
1176         static PBD::Signal0<void> Quit;
1177
1178         /** Emitted when Ardour is asked to load a session in an older session
1179          * format, and makes a backup copy.
1180          */
1181         static PBD::Signal2<void,std::string,std::string> VersionMismatch;
1182
1183         SceneChanger* scene_changer() const { return _scene_changer; }
1184
1185         /* asynchronous MIDI control ports */
1186
1187         boost::shared_ptr<Port> midi_input_port () const;
1188         boost::shared_ptr<Port> midi_output_port () const;
1189         boost::shared_ptr<Port> mmc_output_port () const;
1190         boost::shared_ptr<Port> mmc_input_port () const;
1191         boost::shared_ptr<Port> scene_input_port () const;
1192         boost::shared_ptr<Port> scene_output_port () const;
1193
1194         /* synchronous MIDI ports used for synchronization */
1195
1196         boost::shared_ptr<MidiPort> midi_clock_output_port () const;
1197         boost::shared_ptr<MidiPort> midi_clock_input_port () const;
1198         boost::shared_ptr<MidiPort> mtc_output_port () const;
1199         boost::shared_ptr<MidiPort> mtc_input_port () const;
1200         boost::shared_ptr<Port> ltc_input_port() const;
1201         boost::shared_ptr<Port> ltc_output_port() const;
1202
1203         boost::shared_ptr<IO> ltc_input_io() { return _ltc_input; }
1204         boost::shared_ptr<IO> ltc_output_io() { return _ltc_output; }
1205
1206         MIDI::MachineControl& mmc() { return *_mmc; }
1207
1208         void reconnect_midi_scene_ports (bool);
1209         void reconnect_mtc_ports ();
1210         void reconnect_mmc_ports (bool);
1211
1212         void reconnect_ltc_input ();
1213         void reconnect_ltc_output ();
1214
1215         VCAManager& vca_manager() { return *_vca_manager; }
1216         VCAManager* vca_manager_ptr() { return _vca_manager; }
1217
1218         void auto_connect_thread_wakeup ();
1219
1220
1221 protected:
1222         friend class AudioEngine;
1223         void set_block_size (pframes_t nframes);
1224         void set_sample_rate (samplecnt_t nframes);
1225 #ifdef USE_TRACKS_CODE_FEATURES
1226         void reconnect_existing_routes (bool withLock, bool reconnect_master = true, bool reconnect_inputs = true, bool reconnect_outputs = true);
1227 #endif
1228
1229         friend class Route;
1230         void schedule_curve_reallocation ();
1231         void update_latency_compensation (bool force = false);
1232
1233 private:
1234         int  create (const std::string& mix_template, BusProfile*);
1235         void destroy ();
1236
1237         static guint _name_id_counter;
1238         static void init_name_id_counter (guint n);
1239         static unsigned int name_id_counter ();
1240
1241         /* stuff used in process() should be close together to
1242            maximise cache hits
1243         */
1244
1245         typedef void (Session::*process_function_type)(pframes_t);
1246
1247         AudioEngine&            _engine;
1248         mutable gint             processing_prohibited;
1249         process_function_type    process_function;
1250         process_function_type    last_process_function;
1251         bool                    _bounce_processing_active;
1252         bool                     waiting_for_sync_offset;
1253         samplecnt_t              _base_sample_rate;     // sample-rate of the session at creation time, "native" SR
1254         samplecnt_t             _nominal_sample_rate;  // overridden by audioengine setting
1255         samplecnt_t             _current_sample_rate;  // this includes video pullup offset
1256         int                      transport_sub_state;
1257         mutable gint            _record_status;
1258         samplepos_t             _transport_sample;
1259         gint                    _seek_counter;
1260         Location*               _session_range_location; ///< session range, or 0 if there is nothing in the session yet
1261         bool                    _session_range_end_is_free;
1262         Slave*                  _slave;
1263         bool                    _silent;
1264         samplecnt_t             _remaining_latency_preroll;
1265
1266         // varispeed playback
1267         double                  _engine_speed;
1268         double                  _transport_speed;
1269         double                  _default_transport_speed;
1270         double                  _last_transport_speed;
1271         double                  _signalled_varispeed;
1272         double                  _target_transport_speed;
1273         CubicInterpolation       interpolation;
1274
1275         bool                     auto_play_legal;
1276         samplepos_t             _last_slave_transport_sample;
1277         samplepos_t             _requested_return_sample;
1278         pframes_t                current_block_size;
1279         samplecnt_t             _worst_output_latency;
1280         samplecnt_t             _worst_input_latency;
1281         samplecnt_t             _worst_route_latency;
1282         uint32_t                _send_latency_changes;
1283         bool                    _have_captured;
1284         bool                    _non_soloed_outs_muted;
1285         bool                    _listening;
1286         uint32_t                _listen_cnt;
1287         uint32_t                _solo_isolated_cnt;
1288         bool                    _writable;
1289         bool                    _was_seamless;
1290         bool                    _under_nsm_control;
1291         unsigned int            _xrun_count;
1292
1293         std::string             _missing_file_replacement;
1294
1295         void mtc_status_changed (bool);
1296         PBD::ScopedConnection mtc_status_connection;
1297         void ltc_status_changed (bool);
1298         PBD::ScopedConnection ltc_status_connection;
1299
1300         void initialize_latencies ();
1301         void update_latency (bool playback);
1302         bool update_route_latency (bool reverse, bool apply_to_delayline);
1303
1304         void set_worst_io_latencies ();
1305         void set_worst_output_latency ();
1306         void set_worst_input_latency ();
1307
1308         void send_latency_compensation_change ();
1309         void set_worst_io_latencies_x (IOChange, void *);
1310
1311         void ensure_buffers (ChanCount howmany = ChanCount::ZERO);
1312
1313         void process_scrub          (pframes_t);
1314         void process_without_events (pframes_t);
1315         void process_with_events    (pframes_t);
1316         void process_audition       (pframes_t);
1317         void process_export         (pframes_t);
1318         void process_export_fw      (pframes_t);
1319
1320         void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
1321         void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
1322         bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); }
1323
1324         static const samplecnt_t bounce_chunk_size;
1325
1326         /* slave tracking */
1327
1328         static const int delta_accumulator_size = 25;
1329         int delta_accumulator_cnt;
1330         int32_t delta_accumulator[delta_accumulator_size];
1331         int32_t average_slave_delta;
1332         int  average_dir;
1333         bool have_first_delta_accumulator;
1334
1335         SlaveState _slave_state;
1336         gint _mtc_active;
1337         gint _ltc_active;
1338         samplepos_t slave_wait_end;
1339
1340         void reset_slave_state ();
1341         bool follow_slave (pframes_t);
1342         void calculate_moving_average_of_slave_delta (int dir, samplecnt_t this_delta);
1343         void track_slave_state (float slave_speed, samplepos_t slave_transport_sample, samplecnt_t this_delta);
1344
1345         void switch_to_sync_source (SyncSource); /* !RT context */
1346         void drop_sync_source ();  /* !RT context */
1347         void use_sync_source (Slave*); /* RT context */
1348
1349         bool post_export_sync;
1350         samplepos_t post_export_position;
1351
1352         bool _exporting;
1353         bool _export_rolling;
1354         bool _realtime_export;
1355         bool _region_export;
1356         samplepos_t _export_preroll;
1357
1358         boost::shared_ptr<ExportHandler> export_handler;
1359         boost::shared_ptr<ExportStatus>  export_status;
1360
1361         int  pre_export ();
1362         int  stop_audio_export ();
1363         void finalize_audio_export ();
1364         void finalize_export_internal (bool stop_freewheel);
1365         bool _pre_export_mmc_enabled;
1366
1367         PBD::ScopedConnection export_freewheel_connection;
1368
1369         void get_track_statistics ();
1370         int  process_routes (pframes_t, bool& need_butler);
1371         int  silent_process_routes (pframes_t, bool& need_butler);
1372
1373         /** @return 1 if there is a pending declick fade-in,
1374             -1 if there is a pending declick fade-out,
1375             0 if there is no pending declick.
1376         */
1377         int get_transport_declick_required () {
1378                 if (transport_sub_state & PendingDeclickIn) {
1379                         transport_sub_state &= ~PendingDeclickIn;
1380                         return 1;
1381                 } else if (transport_sub_state & PendingDeclickOut) {
1382                         /* XXX: not entirely sure why we don't clear this */
1383                         return -1;
1384                 } else if (transport_sub_state & PendingLoopDeclickOut) {
1385                         /* Return the declick out first ... */
1386                         transport_sub_state &= ~PendingLoopDeclickOut;
1387                         return -1;
1388                 } else if (transport_sub_state & PendingLoopDeclickIn) {
1389                         /* ... then the declick in on the next call */
1390                         transport_sub_state &= ~PendingLoopDeclickIn;
1391                         return 1;
1392                 } else {
1393                         return 0;
1394                 }
1395         }
1396
1397         bool maybe_stop (samplepos_t limit);
1398         bool maybe_sync_start (pframes_t &);
1399
1400         void check_declick_out ();
1401
1402         std::string             _path;
1403         std::string             _name;
1404         bool                    _is_new;
1405         bool                    _send_qf_mtc;
1406         /** Number of process samples since the last MTC output (when sending MTC); used to
1407          *  know when to send full MTC messages every so often.
1408          */
1409         pframes_t               _pframes_since_last_mtc;
1410         bool                     play_loop;
1411         bool                     loop_changing;
1412         samplepos_t               last_loopend;
1413
1414         boost::scoped_ptr<SessionDirectory> _session_dir;
1415
1416         void hookup_io ();
1417         void graph_reordered ();
1418
1419         /** current snapshot name, without the .ardour suffix */
1420         void set_snapshot_name (const std::string &);
1421         void save_snapshot_name (const std::string &);
1422         std::string _current_snapshot_name;
1423
1424         XMLTree*         state_tree;
1425         bool             state_was_pending;
1426         StateOfTheState _state_of_the_state;
1427
1428         friend class    StateProtector;
1429         gint            _suspend_save; /* atomic */
1430         volatile bool   _save_queued;
1431         Glib::Threads::Mutex save_state_lock;
1432         Glib::Threads::Mutex save_source_lock;
1433         Glib::Threads::Mutex peak_cleanup_lock;
1434
1435         int        load_options (const XMLNode&);
1436         int        load_state (std::string snapshot_name);
1437         static int parse_stateful_loading_version (const std::string&);
1438
1439         samplepos_t _last_roll_location;
1440         /** the session sample time at which we last rolled, located, or changed transport direction */
1441         samplepos_t _last_roll_or_reversal_location;
1442         samplepos_t _last_record_location;
1443
1444         bool              pending_locate_roll;
1445         samplepos_t        pending_locate_sample;
1446         bool              pending_locate_flush;
1447         bool              pending_abort;
1448         bool              pending_auto_loop;
1449
1450         PBD::ReallocPool _mempool;
1451         LuaState lua;
1452         Glib::Threads::Mutex lua_lock;
1453         luabridge::LuaRef * _lua_run;
1454         luabridge::LuaRef * _lua_add;
1455         luabridge::LuaRef * _lua_del;
1456         luabridge::LuaRef * _lua_list;
1457         luabridge::LuaRef * _lua_load;
1458         luabridge::LuaRef * _lua_save;
1459         luabridge::LuaRef * _lua_cleanup;
1460         uint32_t            _n_lua_scripts;
1461
1462         void setup_lua ();
1463         void try_run_lua (pframes_t);
1464
1465         Butler* _butler;
1466
1467         static const PostTransportWork ProcessCannotProceedMask =
1468                 PostTransportWork (
1469                         PostTransportInputChange|
1470                         PostTransportReverse|
1471                         PostTransportCurveRealloc|
1472                         PostTransportAudition|
1473                         PostTransportStop|
1474                         PostTransportClearSubstate);
1475
1476         gint _post_transport_work; /* accessed only atomic ops */
1477         PostTransportWork post_transport_work() const        { return (PostTransportWork) g_atomic_int_get (const_cast<gint*>(&_post_transport_work)); }
1478         void set_post_transport_work (PostTransportWork ptw) { g_atomic_int_set (&_post_transport_work, (gint) ptw); }
1479         void add_post_transport_work (PostTransportWork ptw);
1480
1481         void schedule_playback_buffering_adjustment ();
1482         void schedule_capture_buffering_adjustment ();
1483
1484         uint32_t    cumulative_rf_motion;
1485         uint32_t    rf_scale;
1486
1487         void set_rf_speed (float speed);
1488         void reset_rf_scale (samplecnt_t samples_moved);
1489
1490         Locations*       _locations;
1491         void location_added (Location*);
1492         void location_removed (Location*);
1493         void locations_changed ();
1494         void _locations_changed (const Locations::LocationList&);
1495
1496         void update_skips (Location*, bool consolidate);
1497         void update_marks (Location* loc);
1498         void consolidate_skips (Location*);
1499         void sync_locations_to_skips ();
1500         void _sync_locations_to_skips ();
1501
1502         PBD::ScopedConnectionList skip_update_connections;
1503         bool _ignore_skips_updates;
1504
1505         PBD::ScopedConnectionList punch_connections;
1506         void             auto_punch_start_changed (Location *);
1507         void             auto_punch_end_changed (Location *);
1508         void             auto_punch_changed (Location *);
1509
1510         PBD::ScopedConnectionList loop_connections;
1511         void             auto_loop_changed (Location *);
1512         void             auto_loop_declick_range (Location *, samplepos_t &, samplepos_t &);
1513
1514         int  ensure_engine (uint32_t desired_sample_rate, bool);
1515         void pre_engine_init (std::string path);
1516         int  post_engine_init ();
1517         int  immediately_post_engine ();
1518         void remove_empty_sounds ();
1519
1520         void session_loaded ();
1521
1522         void setup_midi_control ();
1523         int  midi_read (MIDI::Port *);
1524
1525         void enable_record ();
1526
1527         void increment_transport_position (samplecnt_t val) {
1528                 if (max_samplepos - val < _transport_sample) {
1529                         _transport_sample = max_samplepos;
1530                 } else {
1531                         _transport_sample += val;
1532                 }
1533         }
1534
1535         void decrement_transport_position (samplecnt_t val) {
1536                 if (val < _transport_sample) {
1537                         _transport_sample -= val;
1538                 } else {
1539                         _transport_sample = 0;
1540                 }
1541         }
1542
1543         void post_transport_motion ();
1544         static void *session_loader_thread (void *arg);
1545
1546         void *do_work();
1547
1548         /* Signal Forwarding */
1549         void emit_route_signals ();
1550         void emit_thread_run ();
1551         static void *emit_thread (void *);
1552         void emit_thread_start ();
1553         void emit_thread_terminate ();
1554
1555         pthread_t       _rt_emit_thread;
1556         bool            _rt_thread_active;
1557
1558         pthread_mutex_t _rt_emit_mutex;
1559         pthread_cond_t  _rt_emit_cond;
1560         bool            _rt_emit_pending;
1561
1562         /* Auto Connect Thread */
1563         static void *auto_connect_thread (void *);
1564         void auto_connect_thread_run ();
1565         void auto_connect_thread_start ();
1566         void auto_connect_thread_terminate ();
1567
1568         pthread_t       _auto_connect_thread;
1569         gint            _ac_thread_active;
1570         pthread_mutex_t _auto_connect_mutex;
1571         pthread_cond_t  _auto_connect_cond;
1572
1573         struct AutoConnectRequest {
1574                 public:
1575                 AutoConnectRequest (boost::shared_ptr <Route> r, bool ci,
1576                                 const ChanCount& is,
1577                                 const ChanCount& os,
1578                                 const ChanCount& io,
1579                                 const ChanCount& oo)
1580                         : route (boost::weak_ptr<Route> (r))
1581                         , connect_inputs (ci)
1582                         , input_start (is)
1583                         , output_start (os)
1584                         , input_offset (io)
1585                         , output_offset (oo)
1586                 {}
1587
1588                 boost::weak_ptr <Route> route;
1589                 bool connect_inputs;
1590                 ChanCount input_start;
1591                 ChanCount output_start;
1592                 ChanCount input_offset;
1593                 ChanCount output_offset;
1594         };
1595
1596         typedef std::queue<AutoConnectRequest> AutoConnectQueue;
1597         Glib::Threads::Mutex  _auto_connect_queue_lock;
1598         AutoConnectQueue _auto_connect_queue;
1599         guint _latency_recompute_pending;
1600
1601         void get_physical_ports (std::vector<std::string>& inputs, std::vector<std::string>& outputs, DataType type,
1602                                  MidiPortFlags include = MidiPortFlags (0),
1603                                  MidiPortFlags exclude = MidiPortFlags (0));
1604
1605         void auto_connect (const AutoConnectRequest&);
1606         void queue_latency_recompute ();
1607
1608         /* SessionEventManager interface */
1609
1610         void process_event (SessionEvent*);
1611         void set_next_event ();
1612         void cleanup_event (SessionEvent*,int);
1613
1614         /* MIDI Machine Control */
1615
1616         void spp_start ();
1617         void spp_continue ();
1618         void spp_stop ();
1619
1620         void mmc_deferred_play (MIDI::MachineControl &);
1621         void mmc_stop (MIDI::MachineControl &);
1622         void mmc_step (MIDI::MachineControl &, int);
1623         void mmc_pause (MIDI::MachineControl &);
1624         void mmc_record_pause (MIDI::MachineControl &);
1625         void mmc_record_strobe (MIDI::MachineControl &);
1626         void mmc_record_exit (MIDI::MachineControl &);
1627         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1628         void mmc_fast_forward (MIDI::MachineControl &);
1629         void mmc_rewind (MIDI::MachineControl &);
1630         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1631         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1632         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1633
1634         struct timeval last_mmc_step;
1635         double step_speed;
1636
1637         typedef boost::function<bool()> MidiTimeoutCallback;
1638         typedef std::list<MidiTimeoutCallback> MidiTimeoutList;
1639
1640         MidiTimeoutList midi_timeouts;
1641         bool mmc_step_timeout ();
1642         void send_immediate_mmc (MIDI::MachineControlCommand);
1643
1644         MIDI::byte mtc_msg[16];
1645         MIDI::byte mtc_timecode_bits;   /* encoding of SMTPE type for MTC */
1646         MIDI::byte midi_msg[16];
1647         double outbound_mtc_timecode_frame;
1648         Timecode::Time transmitting_timecode_time;
1649         int next_quarter_frame_to_send;
1650
1651         double _samples_per_timecode_frame; /* has to be floating point because of drop sample */
1652         samplecnt_t _frames_per_hour;
1653         samplecnt_t _timecode_frames_per_hour;
1654
1655         /* cache the most-recently requested time conversions. This helps when we
1656          * have multiple clocks showing the same time (e.g. the transport sample) */
1657         bool last_timecode_valid;
1658         samplepos_t last_timecode_when;
1659         Timecode::Time last_timecode;
1660
1661         bool _send_timecode_update; ///< Flag to send a full sample (Timecode) MTC message this cycle
1662
1663         int send_midi_time_code_for_cycle (samplepos_t, samplepos_t, pframes_t nframes);
1664
1665         LTCEncoder*       ltc_encoder;
1666         ltcsnd_sample_t*  ltc_enc_buf;
1667
1668         Timecode::TimecodeFormat ltc_enc_tcformat;
1669         int32_t           ltc_buf_off;
1670         int32_t           ltc_buf_len;
1671
1672         double            ltc_speed;
1673         int32_t           ltc_enc_byte;
1674         samplepos_t        ltc_enc_pos;
1675         double            ltc_enc_cnt;
1676         samplepos_t        ltc_enc_off;
1677         bool              restarting;
1678         samplepos_t        ltc_prev_cycle;
1679
1680         samplepos_t        ltc_timecode_offset;
1681         bool              ltc_timecode_negative_offset;
1682
1683         LatencyRange      ltc_out_latency;
1684
1685         void ltc_tx_initialize();
1686         void ltc_tx_cleanup();
1687         void ltc_tx_reset();
1688         void ltc_tx_resync_latency();
1689         void ltc_tx_recalculate_position();
1690         void ltc_tx_parse_offset();
1691         void ltc_tx_send_time_code_for_cycle (samplepos_t, samplepos_t, double, double, pframes_t nframes);
1692         PBD::ScopedConnectionList ltc_tx_connections;
1693
1694
1695         void reset_record_status ();
1696
1697         int no_roll (pframes_t nframes);
1698         int fail_roll (pframes_t nframes);
1699
1700         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work()); }
1701         bool process_can_proceed() const { return !(post_transport_work() & ProcessCannotProceedMask); }
1702
1703         MidiControlUI* midi_control_ui;
1704
1705         int           start_midi_thread ();
1706
1707         void set_play_loop (bool yn, double speed);
1708         void unset_play_loop ();
1709         void overwrite_some_buffers (Track *);
1710         void flush_all_inserts ();
1711         int  micro_locate (samplecnt_t distance);
1712         void locate (samplepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false, bool with_mmc=true);
1713         void start_locate (samplepos_t, bool with_roll, bool with_flush, bool for_loop_enabled=false, bool force=false);
1714         void force_locate (samplepos_t sample, bool with_roll = false);
1715         void set_transport_speed (double speed, samplepos_t destination_sample, bool abort = false, bool clear_state = false, bool as_default = false);
1716         void stop_transport (bool abort = false, bool clear_state = false);
1717         void start_transport ();
1718         void realtime_stop (bool abort, bool clear_state);
1719         void realtime_locate ();
1720         void non_realtime_start_scrub ();
1721         void non_realtime_set_speed ();
1722         void non_realtime_locate ();
1723         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1724         void non_realtime_overwrite (int entry_request_count, bool& finished);
1725         void post_transport ();
1726         void engine_halted ();
1727         void xrun_recovery ();
1728         void set_track_loop (bool);
1729         bool select_playhead_priority_target (samplepos_t&);
1730         void follow_playhead_priority ();
1731
1732         /* These are synchronous and so can only be called from within the process
1733          * cycle
1734          */
1735
1736         int  send_full_time_code (samplepos_t, pframes_t nframes);
1737         void send_song_position_pointer (samplepos_t);
1738
1739         TempoMap    *_tempo_map;
1740         void          tempo_map_changed (const PBD::PropertyChange&);
1741
1742         /* edit/mix groups */
1743
1744         int load_route_groups (const XMLNode&, int);
1745
1746         std::list<RouteGroup *> _route_groups;
1747         RouteGroup*             _all_route_group;
1748
1749         /* routes stuff */
1750
1751         boost::shared_ptr<Graph> _process_graph;
1752
1753         SerializedRCUManager<RouteList>  routes;
1754
1755         void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t);
1756         void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t);
1757         bool _adding_routes_in_progress;
1758         bool _reconnecting_routes_in_progress;
1759         bool _route_deletion_in_progress;
1760
1761         uint32_t destructive_index;
1762
1763         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&, int);
1764         boost::shared_ptr<Route> XMLRouteFactory_2X (const XMLNode&, int);
1765         boost::shared_ptr<Route> XMLRouteFactory_3X (const XMLNode&, int);
1766
1767         void route_processors_changed (RouteProcessorChange);
1768
1769         bool find_route_name (std::string const &, uint32_t& id, std::string& name, bool);
1770         void count_existing_track_channels (ChanCount& in, ChanCount& out);
1771         void auto_connect_route (boost::shared_ptr<Route>, bool, const ChanCount&, const ChanCount&, const ChanCount& io = ChanCount(), const ChanCount& oo = ChanCount());
1772         void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr<Route> midi_track);
1773
1774         /* track numbering */
1775
1776         void reassign_track_numbers ();
1777         uint32_t _track_number_decimals;
1778
1779         /* solo/mute/notifications */
1780
1781         void route_listen_changed (PBD::Controllable::GroupControlDisposition, boost::weak_ptr<Route>);
1782         void route_mute_changed ();
1783         void route_solo_changed (bool self_solo_change, PBD::Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route>);
1784         void route_solo_isolated_changed (boost::weak_ptr<Route>);
1785
1786         void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
1787
1788         void listen_position_changed ();
1789         void solo_control_mode_changed ();
1790
1791         /* REGION MANAGEMENT */
1792
1793         mutable Glib::Threads::Mutex region_lock;
1794
1795         int load_regions (const XMLNode& node);
1796         int load_compounds (const XMLNode& node);
1797
1798         void route_added_to_route_group (RouteGroup *, boost::weak_ptr<Route>);
1799         void route_removed_from_route_group (RouteGroup *, boost::weak_ptr<Route>);
1800         void route_group_property_changed (RouteGroup *);
1801
1802         /* SOURCES */
1803
1804         mutable Glib::Threads::Mutex source_lock;
1805
1806 public:
1807         typedef std::map<PBD::ID,boost::shared_ptr<Source> > SourceMap;
1808
1809 private:
1810         void reset_write_sources (bool mark_write_complete, bool force = false);
1811         SourceMap sources;
1812
1813         int load_sources (const XMLNode& node);
1814         XMLNode& get_sources_as_xml ();
1815
1816         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1817
1818         /* PLAYLISTS */
1819
1820         void remove_playlist (boost::weak_ptr<Playlist>);
1821         void track_playlist_changed (boost::weak_ptr<Track>);
1822         void playlist_region_added (boost::weak_ptr<Region>);
1823         void playlist_ranges_moved (std::list<Evoral::RangeMove<samplepos_t> > const &);
1824         void playlist_regions_extended (std::list<Evoral::Range<samplepos_t> > const &);
1825
1826         /* CURVES and AUTOMATION LISTS */
1827         std::map<PBD::ID, AutomationList*> automation_lists;
1828
1829         /* DEFAULT FADE CURVES */
1830
1831         float default_fade_steepness;
1832         float default_fade_msecs;
1833
1834         /* AUDITIONING */
1835
1836         boost::shared_ptr<Auditioner> auditioner;
1837         void set_audition (boost::shared_ptr<Region>);
1838         void non_realtime_set_audition ();
1839         boost::shared_ptr<Region> pending_audition_region;
1840
1841         /* EXPORT */
1842
1843         /* FLATTEN */
1844
1845         int flatten_one_track (AudioTrack&, samplepos_t start, samplecnt_t cnt);
1846
1847         /* INSERT AND SEND MANAGEMENT */
1848
1849         boost::dynamic_bitset<uint32_t> send_bitset;
1850         boost::dynamic_bitset<uint32_t> aux_send_bitset;
1851         boost::dynamic_bitset<uint32_t> return_bitset;
1852         boost::dynamic_bitset<uint32_t> insert_bitset;
1853
1854         /* S/W RAID */
1855
1856         struct space_and_path {
1857                 uint32_t blocks;     ///< 4kB blocks
1858                 bool blocks_unknown; ///< true if blocks is unknown
1859                 std::string path;
1860
1861                 space_and_path ()
1862                         : blocks (0)
1863                         , blocks_unknown (true)
1864                 {}
1865         };
1866
1867         struct space_and_path_ascending_cmp {
1868                 bool operator() (space_and_path a, space_and_path b) {
1869                         if (a.blocks_unknown != b.blocks_unknown) {
1870                                 return !a.blocks_unknown;
1871                         }
1872                         return a.blocks > b.blocks;
1873                 }
1874         };
1875
1876         void setup_raid_path (std::string path);
1877
1878         std::vector<space_and_path> session_dirs;
1879         std::vector<space_and_path>::iterator last_rr_session_dir;
1880         uint32_t _total_free_4k_blocks;
1881         /** If this is true, _total_free_4k_blocks is not definite,
1882             as one or more of the session directories' filesystems
1883             could not report free space.
1884         */
1885         bool _total_free_4k_blocks_uncertain;
1886         Glib::Threads::Mutex space_lock;
1887
1888         bool no_questions_about_missing_files;
1889
1890         std::string get_best_session_directory_for_new_audio ();
1891
1892         mutable gint _playback_load;
1893         mutable gint _capture_load;
1894
1895         /* I/O bundles */
1896
1897         SerializedRCUManager<BundleList> _bundles;
1898         XMLNode* _bundle_xml_node;
1899         int load_bundles (XMLNode const &);
1900
1901         UndoHistory      _history;
1902         /** current undo transaction, or 0 */
1903         UndoTransaction* _current_trans;
1904         /** GQuarks to describe the reversible commands that are currently in progress.
1905          *  These may be nested, in which case more recently-started commands are toward
1906          *  the front of the list.
1907          */
1908         std::list<GQuark> _current_trans_quarks;
1909
1910         int  backend_sync_callback (TransportState, samplepos_t);
1911
1912         void process_rtop (SessionEvent*);
1913
1914         enum snapshot_t {
1915                 NormalSave,
1916                 SnapshotKeep,
1917                 SwitchToSnapshot
1918         };
1919
1920         XMLNode& state (bool save_template,
1921                         snapshot_t snapshot_type = NormalSave,
1922                         bool only_used_assets = false);
1923
1924         XMLNode& get_state ();
1925         int      set_state (const XMLNode& node, int version); // not idempotent
1926         XMLNode& get_template ();
1927
1928         /* click track */
1929         typedef std::list<Click*> Clicks;
1930         Clicks                  clicks;
1931         bool                   _clicking;
1932         bool                   _click_rec_only;
1933         boost::shared_ptr<IO>  _click_io;
1934         boost::shared_ptr<Amp> _click_gain;
1935         Sample*                 click_data;
1936         Sample*                 click_emphasis_data;
1937         samplecnt_t              click_length;
1938         samplecnt_t              click_emphasis_length;
1939         mutable Glib::Threads::RWLock    click_lock;
1940
1941         static const Sample     default_click[];
1942         static const samplecnt_t default_click_length;
1943         static const Sample     default_click_emphasis[];
1944         static const samplecnt_t default_click_emphasis_length;
1945
1946         Click *get_click();
1947         samplepos_t _clicks_cleared;
1948         void   setup_click_sounds (int which);
1949         void   setup_click_sounds (Sample**, Sample const *, samplecnt_t*, samplecnt_t, std::string const &);
1950         void   clear_clicks ();
1951         void   click (samplepos_t start, samplecnt_t nframes);
1952         void   run_click (samplepos_t start, samplecnt_t nframes);
1953         void   add_click (samplepos_t pos, bool emphasis);
1954         samplecnt_t _count_in_samples;
1955
1956         /* range playback */
1957
1958         std::list<AudioRange> current_audio_range;
1959         bool _play_range;
1960         void set_play_range (std::list<AudioRange>&, bool leave_rolling);
1961         void unset_play_range ();
1962
1963         /* temporary hacks to allow selection to be pushed from GUI into backend
1964            Whenever we move the selection object into libardour, these will go away.
1965         */
1966         Evoral::Range<samplepos_t> _range_selection;
1967         Evoral::Range<samplepos_t> _object_selection;
1968
1969         void unset_preroll_record_trim ();
1970
1971         samplecnt_t _preroll_record_trim_len;
1972         bool _count_in_once;
1973
1974         /* main outs */
1975         uint32_t main_outs;
1976
1977         boost::shared_ptr<Route> _master_out;
1978         boost::shared_ptr<Route> _monitor_out;
1979
1980         void auto_connect_master_bus ();
1981
1982         int find_all_sources (std::string path, std::set<std::string>& result);
1983         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1984
1985         typedef std::set<boost::shared_ptr<PBD::Controllable> > Controllables;
1986         Glib::Threads::Mutex controllables_lock;
1987         Controllables controllables;
1988
1989         boost::shared_ptr<PBD::Controllable> _solo_cut_control;
1990
1991         void reset_native_file_format();
1992         bool first_file_data_format_reset;
1993         bool first_file_header_format_reset;
1994
1995         void config_changed (std::string, bool);
1996
1997         XMLNode& get_control_protocol_state ();
1998
1999         void set_history_depth (uint32_t depth);
2000
2001         static bool _disable_all_loaded_plugins;
2002         static bool _bypass_all_loaded_plugins;
2003
2004         mutable bool have_looped; ///< Used in ::audible_sample(*)
2005
2006         void update_route_record_state ();
2007         gint _have_rec_enabled_track;
2008         gint _have_rec_disabled_track;
2009
2010         static int ask_about_playlist_deletion (boost::shared_ptr<Playlist>);
2011
2012         /* realtime "apply to set of routes" operations */
2013         template<typename T> SessionEvent*
2014                 get_rt_event (boost::shared_ptr<RouteList> rl, T targ, SessionEvent::RTeventCallback after, PBD::Controllable::GroupControlDisposition group_override,
2015                               void (Session::*method) (boost::shared_ptr<RouteList>, T, PBD::Controllable::GroupControlDisposition)) {
2016                 SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
2017                 ev->rt_slot = boost::bind (method, this, rl, targ, group_override);
2018                 ev->rt_return = after;
2019                 ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
2020
2021                 return ev;
2022         }
2023
2024         /* specialized version realtime "apply to set of routes" operations */
2025         template<typename T1, typename T2> SessionEvent*
2026                 get_rt_event (boost::shared_ptr<RouteList> rl, T1 t1arg, T2 t2arg, SessionEvent::RTeventCallback after, PBD::Controllable::GroupControlDisposition group_override,
2027                               void (Session::*method) (boost::shared_ptr<RouteList>, T1, T2, PBD::Controllable::GroupControlDisposition)) {
2028                 SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
2029                 ev->rt_slot = boost::bind (method, this, rl, t1arg, t2arg, group_override);
2030                 ev->rt_return = after;
2031                 ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
2032
2033                 return ev;
2034         }
2035
2036         /* specialized version realtime "apply to set of controls" operations */
2037         SessionEvent* get_rt_event (boost::shared_ptr<ControlList> cl, double arg, PBD::Controllable::GroupControlDisposition group_override) {
2038                 SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
2039                 ev->rt_slot = boost::bind (&Session::rt_set_controls, this, cl, arg, group_override);
2040                 ev->rt_return = Session::rt_cleanup;
2041                 ev->event_loop = PBD::EventLoop::get_event_loop_for_thread ();
2042
2043                 return ev;
2044         }
2045
2046         void rt_set_controls (boost::shared_ptr<ControlList>, double val, PBD::Controllable::GroupControlDisposition group_override);
2047         void rt_clear_all_solo_state (boost::shared_ptr<RouteList>, bool yn, PBD::Controllable::GroupControlDisposition group_override);
2048
2049         void set_session_range_location (samplepos_t, samplepos_t);
2050
2051         void setup_midi_machine_control ();
2052
2053         void step_edit_status_change (bool);
2054         uint32_t _step_editors;
2055
2056         /** true if timecode transmission by the transport is suspended, otherwise false */
2057         mutable gint _suspend_timecode_transmission;
2058
2059         void update_locations_after_tempo_map_change (const Locations::LocationList &);
2060
2061         void start_time_changed (samplepos_t);
2062         void end_time_changed (samplepos_t);
2063
2064         void set_track_monitor_input_status (bool);
2065         samplepos_t compute_stop_limit () const;
2066
2067         boost::shared_ptr<Speakers> _speakers;
2068         void load_nested_sources (const XMLNode& node);
2069
2070         /** The directed graph of routes that is currently being used for audio processing
2071             and solo/mute computations.
2072         */
2073         GraphEdges _current_route_graph;
2074
2075         void ensure_route_presentation_info_gap (PresentationInfo::order_t, uint32_t gap_size);
2076
2077         friend class    ProcessorChangeBlocker;
2078         gint            _ignore_route_processor_changes; /* atomic */
2079
2080         MidiClockTicker* midi_clock;
2081
2082         boost::shared_ptr<IO>   _ltc_input;
2083         boost::shared_ptr<IO>   _ltc_output;
2084
2085         boost::shared_ptr<RTTaskList> _rt_tasklist;
2086
2087         /* Scene Changing */
2088         SceneChanger* _scene_changer;
2089
2090         /* persistent, non-track related MIDI ports */
2091         MidiPortManager* _midi_ports;
2092         MIDI::MachineControl* _mmc;
2093
2094         void setup_ltc ();
2095         void setup_click ();
2096         void setup_click_state (const XMLNode*);
2097         void setup_bundles ();
2098
2099         void save_as_bring_callback (uint32_t, uint32_t, std::string);
2100
2101         static const uint32_t session_end_shift;
2102
2103         std::string _template_state_dir;
2104
2105         VCAManager* _vca_manager;
2106
2107         boost::shared_ptr<Route> get_midi_nth_route_by_id (PresentationInfo::order_t n) const;
2108
2109         std::string created_with;
2110
2111         void midi_track_presentation_info_changed (PBD::PropertyChange const &, boost::weak_ptr<MidiTrack>);
2112         void rewire_selected_midi (boost::shared_ptr<MidiTrack>);
2113         void rewire_midi_selection_ports ();
2114         boost::weak_ptr<MidiTrack> current_midi_target;
2115
2116         CoreSelection* _selection;
2117
2118         bool _global_locate_pending;
2119 };
2120
2121
2122 } // namespace ARDOUR
2123
2124 #endif /* __ardour_session_h__ */