Split butler into separate object (partially, just data so far...)
[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 <list>
24 #include <map>
25 #include <set>
26 #include <stack>
27 #include <string>
28 #include <vector>
29 #include <stdint.h>
30
31 #include <boost/dynamic_bitset.hpp>
32 #include <boost/scoped_ptr.hpp>
33 #include <boost/weak_ptr.hpp>
34 #include <boost/utility.hpp>
35
36 #include <sndfile.h>
37
38 #include <glibmm/thread.h>
39
40 #include "pbd/error.h"
41 #include "pbd/pool.h"
42 #include "pbd/rcu.h"
43 #include "pbd/statefuldestructible.h"
44 #include "pbd/undo.h"
45
46 #include "midi++/mmc.h"
47 #include "midi++/types.h"
48
49 #include "pbd/destructible.h"
50 #include "pbd/stateful.h"
51
52 #include "ardour/ardour.h"
53 #include "ardour/chan_count.h"
54 #include "ardour/rc_configuration.h"
55 #include "ardour/session_configuration.h"
56 #include "ardour/location.h"
57 #include "ardour/smpte.h"
58 #include "ardour/interpolation.h"
59
60 class XMLTree;
61 class XMLNode;
62 class AEffect;
63
64 namespace MIDI {
65         class Port;
66 }
67
68 namespace PBD {
69         class Controllable;
70 }
71
72 namespace Evoral {
73         class Curve;
74 }
75
76 namespace ARDOUR {
77
78 class AudioDiskstream;
79 class AudioEngine;
80 class AudioFileSource;
81 class AudioRegion;
82 class AudioSource;
83 class AudioTrack;
84 class Auditioner;
85 class AutomationList;
86 class AuxInput;
87 class BufferSet;
88 class Bundle;
89 class ControlProtocolInfo;
90 class Diskstream;
91 class ExportHandler;
92 class ExportStatus;
93 class IO;
94 class IOProcessor;
95 class MidiDiskstream;
96 class MidiRegion;
97 class MidiSource;
98 class MidiTrack;
99 class NamedSelection;
100 class Playlist;
101 class PluginInsert;
102 class Port;
103 class PortInsert;
104 class Processor;
105 class Region;
106 class Return;
107 class Route;
108 class RouteGroup;
109 class SMFSource;
110 class Send;
111 class SessionDirectory;
112 class SessionMetadata;
113 class Slave;
114 class Source;
115 class TempoMap;
116 class VSTPlugin;
117 class Butler;
118
119 class Session : public PBD::StatefulDestructible, public boost::noncopyable
120 {
121   private:
122         typedef std::pair<boost::weak_ptr<Route>,bool> RouteBooleanState;
123         typedef std::vector<RouteBooleanState> GlobalRouteBooleanState;
124         typedef std::pair<boost::weak_ptr<Route>,MeterPoint> RouteMeterState;
125         typedef std::vector<RouteMeterState> GlobalRouteMeterState;
126
127   public:
128         enum RecordState {
129                 Disabled = 0,
130                 Enabled = 1,
131                 Recording = 2
132         };
133
134         struct Event {
135                 enum Type {
136                         SetTransportSpeed,
137                         SetDiskstreamSpeed,
138                         Locate,
139                         LocateRoll,
140                         LocateRollLocate,
141                         SetLoop,
142                         PunchIn,
143                         PunchOut,
144                         RangeStop,
145                         RangeLocate,
146                         Overwrite,
147                         SetSlaveSource,
148                         Audition,
149                         InputConfigurationChange,
150                         SetAudioRange,
151                         SetPlayRange,
152
153                         /* only one of each of these events can be queued at any one time */
154
155                         StopOnce,
156                         AutoLoop
157                 };
158
159                 enum Action {
160                         Add,
161                         Remove,
162                         Replace,
163                         Clear
164                 };
165
166                 Type             type;
167                 Action           action;
168                 nframes_t        action_frame;
169                 nframes_t        target_frame;
170                 double           speed;
171
172                 union {
173                         void*        ptr;
174                         bool         yes_or_no;
175                         nframes_t    target2_frame;
176                         SlaveSource  slave;
177                         Route*       route;
178                 };
179
180                 std::list<AudioRange> audio_range;
181                 std::list<MusicRange> music_range;
182
183                 boost::shared_ptr<Region> region;
184
185                 Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false)
186                         : type (t)
187                         , action (a)
188                         , action_frame (when)
189                         , target_frame (where)
190                         , speed (spd)
191                         , yes_or_no (yn)
192                 {}
193
194                 void set_ptr (void* p) {
195                         ptr = p;
196                 }
197
198                 bool before (const Event& other) const {
199                         return action_frame < other.action_frame;
200                 }
201
202                 bool after (const Event& other) const {
203                         return action_frame > other.action_frame;
204                 }
205
206                 static bool compare (const Event *e1, const Event *e2) {
207                         return e1->before (*e2);
208                 }
209
210                 void *operator new (size_t) {
211                         return pool.alloc ();
212                 }
213
214                 void operator delete (void *ptr, size_t /*size*/) {
215                         pool.release (ptr);
216                 }
217
218                 static const nframes_t Immediate = 0;
219
220                 private:
221                 static MultiAllocSingleReleasePool pool;
222         };
223
224         /* creating from an XML file */
225
226         Session (AudioEngine&,
227                         const std::string& fullpath,
228                         const std::string& snapshot_name,
229                         std::string mix_template = "");
230
231         /* creating a new Session */
232
233         Session (AudioEngine&,
234                         std::string fullpath,
235                         std::string snapshot_name,
236                         AutoConnectOption input_auto_connect,
237                         AutoConnectOption output_auto_connect,
238                         uint32_t control_out_channels,
239                         uint32_t master_out_channels,
240                         uint32_t n_physical_in,
241                         uint32_t n_physical_out,
242                         nframes_t initial_length);
243
244         virtual ~Session ();
245
246         std::string path() const { return _path; }
247         std::string name() const { return _name; }
248         std::string snap_name() const { return _current_snapshot_name; }
249         std::string raid_path () const;
250
251         void set_snap_name ();
252
253         bool writable() const { return _writable; }
254         void set_dirty ();
255         void set_clean ();
256         bool dirty() const { return _state_of_the_state & Dirty; }
257         void set_deletion_in_progress ();
258         void clear_deletion_in_progress ();
259         bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
260         sigc::signal<void> DirtyChanged;
261
262         const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
263
264         static sigc::signal<void> AutoBindingOn;
265         static sigc::signal<void> AutoBindingOff;
266
267         static sigc::signal<void,std::string> Dialog;
268
269         std::string sound_dir (bool with_path = true) const;
270         std::string peak_dir () const;
271         std::string dead_sound_dir () const;
272         std::string automation_dir () const;
273         std::string analysis_dir() const;
274
275         int ensure_subdirs ();
276
277         Glib::ustring peak_path (Glib::ustring) const;
278
279         static std::string change_source_path_by_name (std::string oldpath, std::string oldname, std::string newname, bool destructive);
280
281         std::string peak_path_from_audio_path (std::string) const;
282         std::string new_audio_source_name (const std::string&, uint32_t nchans, uint32_t chan, bool destructive);
283         std::string new_midi_source_name (const std::string&);
284         std::string new_source_path_from_name (DataType type, const std::string&);
285         RouteList new_route_from_template (uint32_t how_many, const std::string& template_path);
286
287         void process (nframes_t nframes);
288
289         BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
290         BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO);
291         BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
292
293         void add_diskstream (boost::shared_ptr<Diskstream>);
294         boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
295         boost::shared_ptr<Diskstream> diskstream_by_name (std::string name);
296         bool have_rec_enabled_diskstream () const;
297
298         bool have_captured() const { return _have_captured; }
299
300         void refill_all_diskstream_buffers ();
301         uint32_t audio_diskstream_buffer_size() const { return audio_dstream_buffer_size; }
302         uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
303
304         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
305         uint32_t n_diskstreams() const;
306
307         typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
308
309         int load_routes (const XMLNode&, int);
310         boost::shared_ptr<RouteList> get_routes() const {
311                 return routes.reader ();
312         }
313
314         uint32_t nroutes() const { return routes.reader()->size(); }
315         uint32_t ntracks () const;
316         uint32_t nbusses () const;
317
318         boost::shared_ptr<BundleList> bundles () {
319                 return _bundles.reader ();
320         }
321
322         struct RoutePublicOrderSorter {
323                 bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
324         };
325
326         void sync_order_keys (std::string const &);
327
328         template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
329         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
330         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg);
331
332         boost::shared_ptr<Route> route_by_name (std::string);
333         boost::shared_ptr<Route> route_by_id (PBD::ID);
334         boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
335
336         bool route_name_unique (std::string) const;
337         bool route_name_internal (std::string) const;
338
339         bool get_record_enabled() const {
340                 return (record_status () >= Enabled);
341         }
342
343         RecordState record_status() const {
344                 return (RecordState) g_atomic_int_get (&_record_status);
345         }
346
347         bool actively_recording () {
348                 return record_status() == Recording;
349         }
350
351         bool record_enabling_legal () const;
352         void maybe_enable_record ();
353         void disable_record (bool rt_context, bool force = false);
354         void step_back_from_record ();
355
356         void maybe_write_autosave ();
357
358         /* Proxy signal for region hidden changes */
359
360         sigc::signal<void,boost::shared_ptr<Region> > RegionHiddenChange;
361
362         /* Emitted when all i/o connections are complete */
363
364         sigc::signal<void> IOConnectionsComplete;
365
366         /* Record status signals */
367
368         sigc::signal<void> RecordStateChanged;
369
370         /* Transport mechanism signals */
371
372         sigc::signal<void> TransportStateChange; /* generic */
373         sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */
374         sigc::signal<void> DurationChanged;
375         sigc::signal<void,nframes_t> Xrun;
376         sigc::signal<void> TransportLooped;
377
378         /** emitted when a locate has occurred */
379         sigc::signal<void> Located;
380
381         sigc::signal<void,RouteList&> RouteAdded;
382         sigc::signal<void> RouteGroupChanged;
383
384         void request_roll_at_and_return (nframes_t start, nframes_t return_to);
385         void request_bounded_roll (nframes_t start, nframes_t end);
386         void request_stop (bool abort = false);
387         void request_locate (nframes_t frame, bool with_roll = false);
388
389         void request_play_loop (bool yn);
390         bool get_play_loop () const { return play_loop; }
391
392         nframes_t  last_transport_start() const { return _last_roll_location; }
393         void goto_end ()   { request_locate (end_location->start(), false);}
394         void goto_start () { request_locate (start_location->start(), false); }
395         void set_session_start (nframes_t start) { start_location->set_start(start); }
396         void set_session_end (nframes_t end) { end_location->set_start(end); config.set_end_marker_is_free (false); }
397         void use_rf_shuttle_speed ();
398         void allow_auto_play (bool yn);
399         void request_transport_speed (double speed);
400         void request_overwrite_buffer (Diskstream*);
401         void request_diskstream_speed (Diskstream&, double speed);
402         void request_input_change_handling ();
403
404         bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
405         bool transport_locked () const;
406
407         int wipe ();
408
409         int remove_region_from_region_list (boost::shared_ptr<Region>);
410
411         nframes_t get_maximum_extent () const;
412         nframes_t current_end_frame() const { return end_location->start(); }
413         nframes_t current_start_frame() const { return start_location->start(); }
414         /// "actual" sample rate of session, set by current audioengine rate, pullup/down etc.
415         nframes_t frame_rate() const   { return _current_frame_rate; }
416         /// "native" sample rate of session, regardless of current audioengine rate, pullup/down etc
417         nframes_t nominal_frame_rate() const   { return _nominal_frame_rate; }
418         nframes_t frames_per_hour() const { return _frames_per_hour; }
419
420         double frames_per_smpte_frame() const { return _frames_per_smpte_frame; }
421         nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; }
422
423         MIDI::byte get_mtc_smpte_bits() const {
424                 return mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
425         }
426
427         float smpte_frames_per_second() const;
428         bool smpte_drop_frames() const;
429
430         /* Locations */
431
432         Locations *locations() { return &_locations; }
433
434         sigc::signal<void,Location*>    auto_loop_location_changed;
435         sigc::signal<void,Location*>    auto_punch_location_changed;
436         sigc::signal<void>              locations_modified;
437
438         void set_auto_punch_location (Location *);
439         void set_auto_loop_location (Location *);
440         int location_name(std::string& result, std::string base = std::string(""));
441
442         void reset_input_monitor_state ();
443
444         void add_event (nframes_t action_frame, Event::Type type, nframes_t target_frame = 0);
445         void remove_event (nframes_t frame, Event::Type type);
446         void clear_events (Event::Type type);
447
448         nframes_t get_block_size()        const { return current_block_size; }
449         nframes_t worst_output_latency () const { return _worst_output_latency; }
450         nframes_t worst_input_latency ()  const { return _worst_input_latency; }
451         nframes_t worst_track_latency ()  const { return _worst_track_latency; }
452
453         int save_state (std::string snapshot_name, bool pending = false);
454         int restore_state (std::string snapshot_name);
455         int save_template (std::string template_name);
456         int save_history (std::string snapshot_name = "");
457         int restore_history (std::string snapshot_name);
458         void remove_state (std::string snapshot_name);
459         void rename_state (std::string old_name, std::string new_name);
460         void remove_pending_capture_state ();
461
462         static int rename_template (std::string old_name, std::string new_name);
463         static int delete_template (std::string name);
464
465         sigc::signal<void,std::string> StateSaved;
466         sigc::signal<void> StateReady;
467
468         std::vector<std::string*>* possible_states() const;
469         static std::vector<std::string*>* possible_states (std::string path);
470
471         XMLNode& get_state();
472         int      set_state(const XMLNode& node, int version); // not idempotent
473         XMLNode& get_template();
474
475         /// The instant xml file is written to the session directory
476         void add_instant_xml (XMLNode&, bool write_to_config = true);
477         XMLNode* instant_xml (const std::string& str);
478
479         enum StateOfTheState {
480                 Clean = 0x0,
481                 Dirty = 0x1,
482                 CannotSave = 0x2,
483                 Deletion = 0x4,
484                 InitialConnecting = 0x8,
485                 Loading = 0x10,
486                 InCleanup = 0x20
487         };
488
489         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
490
491         void add_route_group (RouteGroup *);
492         void remove_route_group (RouteGroup&);
493
494         RouteGroup *route_group_by_name (std::string);
495
496         sigc::signal<void,RouteGroup*> route_group_added;
497         sigc::signal<void>             route_group_removed;
498
499         void foreach_route_group (sigc::slot<void,RouteGroup*> sl) {
500                 for (std::list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); i++) {
501                         sl (*i);
502                 }
503         }
504
505         /* fundamental operations. duh. */
506
507         std::list<boost::shared_ptr<AudioTrack> > new_audio_track (
508                 int input_channels, int output_channels, TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1
509                 );
510
511         RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many);
512
513         std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
514                 TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1
515                 );
516
517         void   remove_route (boost::shared_ptr<Route>);
518         void   resort_routes ();
519         void   resort_routes_using (boost::shared_ptr<RouteList>);
520
521         void   set_remote_control_ids();
522
523         AudioEngine & engine() { return _engine; }
524         AudioEngine const & engine () const { return _engine; }
525
526         int32_t  max_level;
527         int32_t  min_level;
528
529         /* Time */
530
531         nframes_t transport_frame () const {return _transport_frame; }
532         nframes_t audible_frame () const;
533         nframes64_t requested_return_frame() const { return _requested_return_frame; }
534
535         enum PullupFormat {
536                 pullup_Plus4Plus1,
537                 pullup_Plus4,
538                 pullup_Plus4Minus1,
539                 pullup_Plus1,
540                 pullup_None,
541                 pullup_Minus1,
542                 pullup_Minus4Plus1,
543                 pullup_Minus4,
544                 pullup_Minus4Minus1
545         };
546
547         void sync_time_vars();
548
549         void bbt_time (nframes_t when, BBT_Time&);
550         void smpte_to_sample(SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes) const;
551         void sample_to_smpte(nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes) const;
552         void smpte_time (SMPTE::Time &);
553         void smpte_time (nframes_t when, SMPTE::Time&);
554         void smpte_time_subframes (nframes_t when, SMPTE::Time&);
555
556         void smpte_duration (nframes_t, SMPTE::Time&) const;
557         void smpte_duration_string (char *, nframes_t) const;
558
559         void           set_smpte_offset (nframes_t);
560         nframes_t      smpte_offset () const { return _smpte_offset; }
561         void           set_smpte_offset_negative (bool);
562         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
563
564         nframes_t convert_to_frames_at (nframes_t position, AnyTime const &);
565
566         static sigc::signal<void> StartTimeChanged;
567         static sigc::signal<void> EndTimeChanged;
568         static sigc::signal<void> SMPTEOffsetChanged;
569
570         void   request_slave_source (SlaveSource);
571         bool   synced_to_jack() const { return Config->get_slave_source() == JACK; }
572
573         double transport_speed() const { return _transport_speed; }
574         bool   transport_stopped() const { return _transport_speed == 0.0f; }
575         bool   transport_rolling() const { return _transport_speed != 0.0f; }
576
577         void set_silent (bool yn);
578         bool silent () { return _silent; }
579
580         int jack_slave_sync (nframes_t);
581
582         TempoMap& tempo_map() { return *_tempo_map; }
583
584         /// signals the current transport position in frames, bbt and smpte time (in that order)
585         sigc::signal<void, const nframes_t&, const BBT_Time&, const SMPTE::Time&> tick;
586
587         /* region info  */
588
589         void add_regions (std::vector<boost::shared_ptr<Region> >&);
590
591         sigc::signal<void,boost::weak_ptr<Region> > RegionAdded;
592         sigc::signal<void,std::vector<boost::weak_ptr<Region> >& > RegionsAdded;
593         sigc::signal<void,boost::weak_ptr<Region> > RegionRemoved;
594
595         int region_name (std::string& result, std::string base = std::string(""), bool newlevel = false);
596         std::string new_region_name (std::string);
597         std::string path_from_region_name (DataType type, std::string name, std::string identifier);
598
599         boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>);
600
601         void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
602
603         boost::shared_ptr<Region>      XMLRegionFactory (const XMLNode&, bool full);
604         boost::shared_ptr<AudioRegion> XMLAudioRegionFactory (const XMLNode&, bool full);
605         boost::shared_ptr<MidiRegion>  XMLMidiRegionFactory (const XMLNode&, bool full);
606
607         template<class T> void foreach_region (T *obj, void (T::*func)(boost::shared_ptr<Region>));
608
609         /* source management */
610
611         struct ImportStatus : public InterThreadInfo {
612                 std::string doing_what;
613
614                 /* control info */
615                 uint32_t total;
616                 SrcQuality quality;
617                 volatile bool freeze;
618                 std::vector<Glib::ustring> paths;
619                 bool replace_existing_source;
620
621                 /* result */
622                 SourceList sources;
623         };
624
625         void import_audiofiles (ImportStatus&);
626         bool sample_rate_convert (ImportStatus&, std::string infile, std::string& outfile);
627         std::string build_tmp_convert_name (std::string file);
628
629         boost::shared_ptr<ExportHandler> get_export_handler ();
630         boost::shared_ptr<ExportStatus> get_export_status ();
631
632         int  start_audio_export (nframes_t position, bool realtime);
633
634         sigc::signal<int, nframes_t> ProcessExport;
635         sigc::signal<void> ExportReadFinished;
636         static sigc::signal<void, std::string, std::string> Exported;
637
638         void add_source (boost::shared_ptr<Source>);
639         void remove_source (boost::weak_ptr<Source>);
640
641         struct cleanup_report {
642                 std::vector<std::string> paths;
643                 int64_t        space;
644         };
645
646         int  cleanup_sources (cleanup_report&);
647         int  cleanup_trash_sources (cleanup_report&);
648
649         int destroy_region (boost::shared_ptr<Region>);
650         int destroy_regions (std::list<boost::shared_ptr<Region> >);
651
652         int remove_last_capture ();
653
654         /** handlers should return -1 for "stop cleanup",
655             0 for "yes, delete this playlist",
656             1 for "no, don't delete this playlist".
657         */
658         sigc::signal<int,boost::shared_ptr<ARDOUR::Playlist> > AskAboutPlaylistDeletion;
659
660         /** handlers should return 0 for "ignore the rate mismatch",
661             !0 for "do not use this session"
662         */
663         static sigc::signal<int,nframes_t, nframes_t> AskAboutSampleRateMismatch;
664
665         /** handlers should return !0 for use pending state, 0 for ignore it.
666         */
667         static sigc::signal<int> AskAboutPendingState;
668
669         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
670
671         boost::shared_ptr<MidiSource> create_midi_source_for_session (ARDOUR::MidiDiskstream&);
672
673         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
674         boost::shared_ptr<Source> source_by_path_and_channel (const Glib::ustring&, uint16_t);
675
676         /* playlist management */
677
678         boost::shared_ptr<Playlist> playlist_by_name (std::string name);
679         void unassigned_playlists (std::list<boost::shared_ptr<Playlist> > & list);
680         void add_playlist (boost::shared_ptr<Playlist>, bool unused = false);
681         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistAdded;
682         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistRemoved;
683
684         uint32_t n_playlists() const;
685
686         template<class T> void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
687         void get_playlists (std::vector<boost::shared_ptr<Playlist> >&);
688
689         /* named selections */
690
691         NamedSelection* named_selection_by_name (std::string name);
692         void add_named_selection (NamedSelection *);
693         void remove_named_selection (NamedSelection *);
694
695         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
696         sigc::signal<void> NamedSelectionAdded;
697         sigc::signal<void> NamedSelectionRemoved;
698
699         /* Curves and AutomationLists (TODO when they go away) */
700         void add_automation_list(AutomationList*);
701
702         /* fade curves */
703
704         float get_default_fade_length () const { return default_fade_msecs; }
705         float get_default_fade_steepness () const { return default_fade_steepness; }
706         void set_default_fade (float steepness, float msecs);
707
708         /* auditioning */
709
710         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
711         void audition_playlist ();
712         void audition_region (boost::shared_ptr<Region>);
713         void cancel_audition ();
714         bool is_auditioning () const;
715
716         sigc::signal<void,bool> AuditionActive;
717
718         /* flattening stuff */
719
720         boost::shared_ptr<Region> write_one_track (AudioTrack&, nframes_t start, nframes_t end,
721                         bool overwrite, std::vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot,
722                         bool enable_processing = true);
723         int freeze (InterThreadInfo&);
724
725         /* session-wide solo/mute/rec-enable */
726
727         bool soloing() const { return _non_soloed_outs_muted; }
728         bool listening() const { return _listen_cnt > 0; }
729
730         void set_all_solo (bool);
731         void set_all_mute (bool);
732         void set_all_listen (bool);
733
734         sigc::signal<void,bool> SoloActive;
735         sigc::signal<void> SoloChanged;
736
737         void record_disenable_all ();
738         void record_enable_all ();
739
740         /* control/master out */
741
742         boost::shared_ptr<Route> control_out() const { return _control_out; }
743         boost::shared_ptr<Route> master_out() const { return _master_out; }
744
745         void globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p);
746         void globally_set_send_gains_from_track (boost::shared_ptr<Route> dest);
747         void globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest);
748         void globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest);
749         void add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders);
750
751         static void set_disable_all_loaded_plugins (bool yn) {
752                 _disable_all_loaded_plugins = yn;
753         }
754         static bool get_disable_all_loaded_plugins() {
755                 return _disable_all_loaded_plugins;
756         }
757
758         uint32_t next_send_id();
759         uint32_t next_return_id();
760         uint32_t next_insert_id();
761         void mark_send_id (uint32_t);
762         void mark_return_id (uint32_t);
763         void mark_insert_id (uint32_t);
764
765         /* s/w "RAID" management */
766
767         nframes_t available_capture_duration();
768
769         /* I/O bundles */
770
771         void add_bundle (boost::shared_ptr<Bundle>);
772         void remove_bundle (boost::shared_ptr<Bundle>);
773         boost::shared_ptr<Bundle> bundle_by_name (std::string) const;
774
775         sigc::signal<void,boost::shared_ptr<Bundle> > BundleAdded;
776         sigc::signal<void,boost::shared_ptr<Bundle> > BundleRemoved;
777
778         /* MIDI control */
779
780         void midi_panic(void);
781         int set_mtc_port (std::string port_tag);
782         int set_mmc_port (std::string port_tag);
783         int set_midi_port (std::string port_tag);
784         int set_midi_clock_port (std::string port_tag);
785         MIDI::Port *mtc_port() const { return _mtc_port; }
786         MIDI::Port *mmc_port() const { return _mmc_port; }
787         MIDI::Port *midi_port() const { return _midi_port; }
788         MIDI::Port *midi_clock_port() const { return _midi_clock_port; }
789
790         sigc::signal<void> MTC_PortChanged;
791         sigc::signal<void> MMC_PortChanged;
792         sigc::signal<void> MIDI_PortChanged;
793         sigc::signal<void> MIDIClock_PortChanged;
794
795         void set_trace_midi_input (bool, MIDI::Port* port = 0);
796         void set_trace_midi_output (bool, MIDI::Port* port = 0);
797
798         bool get_trace_midi_input(MIDI::Port *port = 0);
799         bool get_trace_midi_output(MIDI::Port *port = 0);
800
801         void set_mmc_receive_device_id (uint32_t id);
802         void set_mmc_send_device_id (uint32_t id);
803
804         /* Scrubbing */
805
806         void start_scrub (nframes_t where);
807         void stop_scrub ();
808         void set_scrub_speed (float);
809         nframes_t scrub_buffer_size() const;
810         sigc::signal<void> ScrubReady;
811
812         /* History (for editors, mixers, UIs etc.) */
813
814         /** Undo some transactions.
815          * @param n Number of transactions to undo.
816          */
817         void undo (uint32_t n) {
818                 _history.undo (n);
819         }
820
821         void redo (uint32_t n) {
822                 _history.redo (n);
823         }
824
825         UndoHistory& history() { return _history; }
826
827         uint32_t undo_depth() const { return _history.undo_depth(); }
828         uint32_t redo_depth() const { return _history.redo_depth(); }
829         std::string next_undo() const { return _history.next_undo(); }
830         std::string next_redo() const { return _history.next_redo(); }
831
832         void begin_reversible_command (const std::string& cmd_name);
833         void commit_reversible_command (Command* cmd = 0);
834
835         void add_command (Command *const cmd) {
836                 assert(!_current_trans.empty ());
837                 _current_trans.top()->add_command (cmd);
838         }
839
840         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
841
842         // these commands are implemented in libs/ardour/session_command.cc
843         Command* memento_command_factory(XMLNode* n);
844         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
845
846         Command* global_state_command_factory (const XMLNode& n);
847
848         class GlobalRouteStateCommand : public Command
849         {
850         public:
851                 GlobalRouteStateCommand (Session&, void*);
852                 GlobalRouteStateCommand (Session&, const XMLNode& node);
853                 int set_state (const XMLNode&, int version);
854                 XMLNode& get_state ();
855
856         protected:
857                 GlobalRouteBooleanState before, after;
858                 Session& sess;
859                 void* src;
860         };
861
862         class GlobalSoloStateCommand : public GlobalRouteStateCommand
863         {
864         public:
865                 GlobalSoloStateCommand (Session &, void *src);
866                 GlobalSoloStateCommand (Session&, const XMLNode&);
867                 void operator()(); //redo
868                 void undo();
869                 XMLNode &get_state();
870                 void mark();
871         };
872
873         class GlobalMuteStateCommand : public GlobalRouteStateCommand
874         {
875         public:
876                 GlobalMuteStateCommand(Session &, void *src);
877                 GlobalMuteStateCommand (Session&, const XMLNode&);
878                 void operator()(); // redo
879                 void undo();
880                 XMLNode &get_state();
881                 void mark();
882         };
883
884         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
885         {
886         public:
887                 GlobalRecordEnableStateCommand(Session &, void *src);
888                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
889                 void operator()(); // redo
890                 void undo();
891                 XMLNode &get_state();
892                 void mark();
893         };
894
895         class GlobalMeteringStateCommand : public Command
896         {
897         public:
898                 GlobalMeteringStateCommand(Session &, void *src);
899                 GlobalMeteringStateCommand (Session&, const XMLNode&);
900                 void operator()();
901                 void undo();
902                 XMLNode &get_state();
903                 int set_state (const XMLNode&, int version);
904                 void mark();
905
906         protected:
907                 Session& sess;
908                 void* src;
909                 GlobalRouteMeterState before;
910                 GlobalRouteMeterState after;
911         };
912
913         /* clicking */
914
915         boost::shared_ptr<IO> click_io() { return _click_io; }
916
917         /* disk, buffer loads */
918
919         uint32_t playback_load ();
920         uint32_t capture_load ();
921         uint32_t playback_load_min ();
922         uint32_t capture_load_min ();
923
924         void reset_playback_load_min ();
925         void reset_capture_load_min ();
926
927         float read_data_rate () const; // in usec
928         float write_data_rate () const;
929
930         /* ranges */
931
932         void set_audio_range (std::list<AudioRange>&);
933         void set_music_range (std::list<MusicRange>&);
934
935         void request_play_range (bool yn);
936         bool get_play_range () const { return _play_range; }
937
938         /* buffers for gain and pan */
939
940         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
941         pan_t** pan_automation_buffer () const  { return _pan_automation_buffer; }
942
943         void ensure_buffer_set (BufferSet& buffers, const ChanCount& howmany);
944
945         /* VST support */
946
947         static long vst_callback (AEffect* effect,
948                         long opcode,
949                         long index,
950                         long value,
951                         void* ptr,
952                         float opt);
953
954         static sigc::signal<void> SendFeedback;
955
956         /* Controllables */
957
958         boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
959
960         void add_controllable (boost::shared_ptr<PBD::Controllable>);
961         void remove_controllable (PBD::Controllable*);
962
963         SessionMetadata & metadata () { return *_metadata; }
964
965         SessionConfiguration config;
966
967         bool exporting () const {
968                 return _exporting;
969         }
970
971   protected:
972         friend class AudioEngine;
973         void set_block_size (nframes_t nframes);
974         void set_frame_rate (nframes_t nframes);
975
976   protected:
977         friend class Diskstream;
978         void stop_butler ();
979         void wait_till_butler_finished();
980
981   protected:
982         friend class Route;
983         void schedule_curve_reallocation ();
984         void update_latency_compensation (bool, bool);
985
986   private:
987         int  create (bool& new_session, const std::string& mix_template, nframes_t initial_length);
988         void destroy ();
989
990         nframes_t compute_initial_length ();
991
992         enum SubState {
993                 PendingDeclickIn   = 0x1,
994                 PendingDeclickOut  = 0x2,
995                 StopPendingCapture = 0x4,
996                 AutoReturning      = 0x10,
997                 PendingLocate      = 0x20,
998                 PendingSetLoop     = 0x40
999         };
1000
1001         /* stuff used in process() should be close together to
1002            maximise cache hits
1003         */
1004
1005         typedef void (Session::*process_function_type)(nframes_t);
1006
1007         AudioEngine&            _engine;
1008         mutable gint             processing_prohibited;
1009         process_function_type    process_function;
1010         process_function_type    last_process_function;
1011         bool                     waiting_for_sync_offset;
1012         nframes_t               _base_frame_rate;
1013         nframes_t               _current_frame_rate;  //this includes video pullup offset
1014         nframes_t               _nominal_frame_rate;  //ignores audioengine setting, "native" SR
1015         int                      transport_sub_state;
1016         mutable gint            _record_status;
1017         volatile nframes_t      _transport_frame;
1018         Location*                end_location;
1019         Location*                start_location;
1020         Slave*                  _slave;
1021         bool                    _silent;
1022
1023     // varispeed playback
1024         volatile double             _transport_speed;
1025         double                      _last_transport_speed;
1026         double                      _target_transport_speed;
1027         CubicInterpolation          interpolation;
1028
1029         bool                     auto_play_legal;
1030         nframes_t               _last_slave_transport_frame;
1031         nframes_t                maximum_output_latency;
1032         volatile nframes64_t    _requested_return_frame;
1033         BufferSet*              _scratch_buffers;
1034         BufferSet*              _silent_buffers;
1035         BufferSet*              _mix_buffers;
1036         nframes_t                current_block_size;
1037         nframes_t               _worst_output_latency;
1038         nframes_t               _worst_input_latency;
1039         nframes_t               _worst_track_latency;
1040         bool                    _have_captured;
1041         float                   _meter_hold;
1042         float                   _meter_falloff;
1043         bool                    _non_soloed_outs_muted;
1044         uint32_t                _listen_cnt;
1045         bool                    _writable;
1046
1047         void set_worst_io_latencies ();
1048         void set_worst_io_latencies_x (IOChange, void *) {
1049                 set_worst_io_latencies ();
1050         }
1051
1052         void update_latency_compensation_proxy (void* ignored);
1053
1054         void ensure_buffers (ChanCount howmany);
1055
1056         void process_scrub          (nframes_t);
1057         void process_without_events (nframes_t);
1058         void process_with_events    (nframes_t);
1059         void process_audition       (nframes_t);
1060         void process_export         (nframes_t);
1061         int  process_export_fw      (nframes_t);
1062
1063         void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
1064         void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
1065         bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); }
1066
1067         /* slave tracking */
1068
1069         static const int delta_accumulator_size = 25;
1070         int delta_accumulator_cnt;
1071         long delta_accumulator[delta_accumulator_size];
1072         long average_slave_delta;
1073         int  average_dir;
1074         bool have_first_delta_accumulator;
1075
1076         enum SlaveState {
1077                 Stopped,
1078                 Waiting,
1079                 Running
1080         };
1081
1082         SlaveState slave_state;
1083         nframes_t slave_wait_end;
1084
1085         void reset_slave_state ();
1086         bool follow_slave (nframes_t);
1087         void calculate_moving_average_of_slave_delta(int dir, nframes_t this_delta);
1088         void track_slave_state(float slave_speed, nframes_t slave_transport_frame,
1089                                nframes_t this_delta, bool starting);
1090         void follow_slave_silently(nframes_t nframes, float slave_speed);
1091
1092         void set_slave_source (SlaveSource);
1093
1094         SlaveSource post_export_slave;
1095         nframes_t post_export_position;
1096
1097         bool _exporting;
1098         bool _exporting_realtime;
1099
1100         boost::shared_ptr<ExportHandler> export_handler;
1101         boost::shared_ptr<ExportStatus>  export_status;
1102
1103         int  pre_export ();
1104         int  stop_audio_export ();
1105         void finalize_audio_export ();
1106
1107         sigc::connection export_freewheel_connection;
1108
1109         void prepare_diskstreams ();
1110         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1111         int  process_routes (nframes_t);
1112         int  silent_process_routes (nframes_t);
1113
1114         bool get_rec_monitors_input () {
1115                 if (actively_recording()) {
1116                         return true;
1117                 } else {
1118                         if (config.get_auto_input()) {
1119                                 return false;
1120                         } else {
1121                                 return true;
1122                         }
1123                 }
1124         }
1125
1126         int get_transport_declick_required () {
1127                 if (transport_sub_state & PendingDeclickIn) {
1128                         transport_sub_state &= ~PendingDeclickIn;
1129                         return 1;
1130                 } else if (transport_sub_state & PendingDeclickOut) {
1131                         return -1;
1132                 } else {
1133                         return 0;
1134                 }
1135         }
1136
1137         bool maybe_stop (nframes_t limit) {
1138                 if ( (_transport_speed > 0.0f && _transport_frame >= limit)
1139                                 || (_transport_speed < 0.0f && _transport_frame == 0) ) {
1140                         stop_transport ();
1141                         return true;
1142                 }
1143                 return false;
1144         }
1145
1146         bool maybe_sync_start (nframes_t&);
1147
1148         void check_declick_out ();
1149
1150         MIDI::MachineControl*    mmc;
1151         MIDI::Port*             _mmc_port;
1152         MIDI::Port*             _mtc_port;
1153         MIDI::Port*             _midi_port;
1154         MIDI::Port*             _midi_clock_port;
1155         std::string             _path;
1156         std::string             _name;
1157         bool                     session_send_mmc;
1158         bool                     session_send_mtc;
1159         bool                     session_midi_feedback;
1160         bool                     play_loop;
1161         bool                     loop_changing;
1162         nframes_t                last_loopend;
1163
1164         boost::scoped_ptr<SessionDirectory> _session_dir;
1165
1166         RingBuffer<Event*> pending_events;
1167
1168         void hookup_io ();
1169         void when_engine_running ();
1170         void graph_reordered ();
1171
1172         std::string _current_snapshot_name;
1173
1174         XMLTree*         state_tree;
1175         bool             state_was_pending;
1176         StateOfTheState _state_of_the_state;
1177
1178         void     auto_save();
1179         int      load_options (const XMLNode&);
1180         int      load_state (std::string snapshot_name);
1181
1182         nframes_t _last_roll_location;
1183         nframes_t _last_record_location;
1184
1185         bool              pending_locate_roll;
1186         nframes_t         pending_locate_frame;
1187         bool              pending_locate_flush;
1188         bool              pending_abort;
1189         bool              pending_auto_loop;
1190
1191         Butler* butler;
1192
1193         bool transport_work_requested() const;
1194
1195         struct ButlerRequest {
1196                 enum Type {
1197                         Wake,
1198                         Run,
1199                         Pause,
1200                         Quit
1201                 };
1202         };
1203
1204         enum PostTransportWork {
1205                 PostTransportStop               = 0x1,
1206                 PostTransportDisableRecord      = 0x2,
1207                 PostTransportPosition           = 0x8,
1208                 PostTransportDidRecord          = 0x20,
1209                 PostTransportDuration           = 0x40,
1210                 PostTransportLocate             = 0x80,
1211                 PostTransportRoll               = 0x200,
1212                 PostTransportAbort              = 0x800,
1213                 PostTransportOverWrite          = 0x1000,
1214                 PostTransportSpeed              = 0x2000,
1215                 PostTransportAudition           = 0x4000,
1216                 PostTransportScrub              = 0x8000,
1217                 PostTransportReverse            = 0x10000,
1218                 PostTransportInputChange        = 0x20000,
1219                 PostTransportCurveRealloc       = 0x40000
1220         };
1221
1222         static const PostTransportWork ProcessCannotProceedMask =
1223                 PostTransportWork (
1224                                 PostTransportInputChange|
1225                                 PostTransportSpeed|
1226                                 PostTransportReverse|
1227                                 PostTransportCurveRealloc|
1228                                 PostTransportScrub|
1229                                 PostTransportAudition|
1230                                 PostTransportLocate|
1231                                 PostTransportStop);
1232
1233         PostTransportWork post_transport_work;
1234
1235         void             summon_butler ();
1236         void             schedule_butler_transport_work ();
1237         int              start_butler_thread ();
1238         void             terminate_butler_thread ();
1239         static void    *_butler_thread_work (void *arg);
1240         void*            butler_thread_work ();
1241
1242         uint32_t    cumulative_rf_motion;
1243         uint32_t    rf_scale;
1244
1245         void set_rf_speed (float speed);
1246         void reset_rf_scale (nframes_t frames_moved);
1247
1248         Locations        _locations;
1249         void              locations_changed ();
1250         void              locations_added (Location*);
1251         void              handle_locations_changed (Locations::LocationList&);
1252
1253         sigc::connection auto_punch_start_changed_connection;
1254         sigc::connection auto_punch_end_changed_connection;
1255         sigc::connection auto_punch_changed_connection;
1256         void             auto_punch_start_changed (Location *);
1257         void             auto_punch_end_changed (Location *);
1258         void             auto_punch_changed (Location *);
1259
1260         sigc::connection auto_loop_start_changed_connection;
1261         sigc::connection auto_loop_end_changed_connection;
1262         sigc::connection auto_loop_changed_connection;
1263         void             auto_loop_changed (Location *);
1264
1265         typedef std::list<Event *> Events;
1266         Events           events;
1267         Events           immediate_events;
1268         Events::iterator next_event;
1269
1270         /* there can only ever be one of each of these */
1271
1272         Event *auto_loop_event;
1273         Event *punch_out_event;
1274         Event *punch_in_event;
1275
1276         /* events */
1277
1278         void dump_events () const;
1279         void queue_event (Event *ev);
1280         void merge_event (Event*);
1281         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1282         bool _replace_event (Event*);
1283         bool _remove_event (Event *);
1284         void _clear_event_type (Event::Type);
1285
1286         void first_stage_init (std::string path, std::string snapshot_name);
1287         int  second_stage_init (bool new_tracks);
1288         void find_current_end ();
1289         void remove_empty_sounds ();
1290
1291         void setup_midi_control ();
1292         int  midi_read (MIDI::Port *);
1293
1294         void enable_record ();
1295
1296         void increment_transport_position (uint32_t val) {
1297                 if (max_frames - val < _transport_frame) {
1298                         _transport_frame = max_frames;
1299                 } else {
1300                         _transport_frame += val;
1301                 }
1302         }
1303
1304         void decrement_transport_position (uint32_t val) {
1305                 if (val < _transport_frame) {
1306                         _transport_frame -= val;
1307                 } else {
1308                         _transport_frame = 0;
1309                 }
1310         }
1311
1312         void post_transport_motion ();
1313         static void *session_loader_thread (void *arg);
1314
1315         void *do_work();
1316
1317         void set_next_event ();
1318         void process_event (Event *ev);
1319
1320         /* MIDI Machine Control */
1321
1322         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1323
1324         void spp_start (MIDI::Parser&, nframes_t timestamp);
1325         void spp_continue (MIDI::Parser&, nframes_t timestamp);
1326         void spp_stop (MIDI::Parser&, nframes_t timestamp);
1327
1328         void mmc_deferred_play (MIDI::MachineControl &);
1329         void mmc_stop (MIDI::MachineControl &);
1330         void mmc_step (MIDI::MachineControl &, int);
1331         void mmc_pause (MIDI::MachineControl &);
1332         void mmc_record_pause (MIDI::MachineControl &);
1333         void mmc_record_strobe (MIDI::MachineControl &);
1334         void mmc_record_exit (MIDI::MachineControl &);
1335         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1336         void mmc_fast_forward (MIDI::MachineControl &);
1337         void mmc_rewind (MIDI::MachineControl &);
1338         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1339         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1340         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1341
1342         struct timeval last_mmc_step;
1343         double step_speed;
1344
1345         typedef sigc::slot<bool> MidiTimeoutCallback;
1346         typedef std::list<MidiTimeoutCallback> MidiTimeoutList;
1347
1348         MidiTimeoutList midi_timeouts;
1349         bool mmc_step_timeout ();
1350
1351         MIDI::byte mmc_buffer[32];
1352         MIDI::byte mtc_msg[16];
1353         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1354         MIDI::byte midi_msg[16];
1355         nframes_t  outbound_mtc_smpte_frame;
1356         SMPTE::Time transmitting_smpte_time;
1357         int next_quarter_frame_to_send;
1358
1359         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1360         nframes_t _frames_per_hour;
1361         nframes_t _smpte_frames_per_hour;
1362         nframes_t _smpte_offset;
1363         bool _smpte_offset_negative;
1364
1365         /* cache the most-recently requested time conversions. This helps when we
1366          * have multiple clocks showing the same time (e.g. the transport frame) */
1367         bool           last_smpte_valid;
1368         nframes_t last_smpte_when;
1369         SMPTE::Time    last_smpte;
1370
1371         bool _send_smpte_update; ///< Flag to send a full frame (SMPTE) MTC message this cycle
1372
1373         int send_full_time_code(nframes_t nframes);
1374         int send_midi_time_code_for_cycle(nframes_t nframes);
1375
1376         nframes_t adjust_apparent_position (nframes_t frames);
1377
1378         void reset_record_status ();
1379
1380         int no_roll (nframes_t nframes);
1381         int fail_roll (nframes_t nframes);
1382
1383         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1384         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1385
1386         struct MIDIRequest {
1387                 enum Type {
1388                         PortChange,
1389                         Quit
1390                 };
1391                 Type type;
1392         };
1393
1394         Glib::Mutex  midi_lock;
1395         pthread_t    midi_thread;
1396         int          midi_request_pipe[2];
1397         RingBuffer<MIDIRequest*> midi_requests;
1398
1399         int           start_midi_thread ();
1400         void          terminate_midi_thread ();
1401         void          poke_midi_thread ();
1402         static void *_midi_thread_work (void *arg);
1403         void          midi_thread_work ();
1404         void          change_midi_ports ();
1405         int           use_config_midi_ports ();
1406
1407         void set_play_loop (bool yn);
1408         void overwrite_some_buffers (Diskstream*);
1409         void flush_all_inserts ();
1410         int  micro_locate (nframes_t distance);
1411         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1412         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1413         void force_locate (nframes_t frame, bool with_roll = false);
1414         void set_diskstream_speed (Diskstream*, double speed);
1415         void set_transport_speed (double speed, bool abort = false);
1416         void stop_transport (bool abort = false);
1417         void start_transport ();
1418         void realtime_stop (bool abort);
1419         void non_realtime_start_scrub ();
1420         void non_realtime_set_speed ();
1421         void non_realtime_locate ();
1422         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1423         void non_realtime_overwrite (int entry_request_count, bool& finished);
1424         void butler_transport_work ();
1425         void post_transport ();
1426         void engine_halted ();
1427         void xrun_recovery ();
1428
1429         TempoMap    *_tempo_map;
1430         void          tempo_map_changed (Change);
1431
1432         /* edit/mix groups */
1433
1434         int load_route_groups (const XMLNode&, int);
1435
1436         std::list<RouteGroup *> _route_groups;
1437
1438         /* disk-streams */
1439
1440         SerializedRCUManager<DiskstreamList>  diskstreams;
1441
1442         uint32_t audio_dstream_buffer_size;
1443         uint32_t midi_dstream_buffer_size;
1444         int load_diskstreams (const XMLNode&);
1445
1446         /* routes stuff */
1447
1448         SerializedRCUManager<RouteList>  routes;
1449
1450         void add_routes (RouteList&, bool save);
1451         uint32_t destructive_index;
1452
1453         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&, int);
1454
1455         /* mixer stuff */
1456
1457         bool solo_update_disabled;
1458
1459         void route_listen_changed (void *src, boost::weak_ptr<Route>);
1460         void route_mute_changed (void *src);
1461         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1462         void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
1463
1464         void listen_position_changed ();
1465         void solo_control_mode_changed ();
1466
1467         /* REGION MANAGEMENT */
1468
1469         std::map<std::string,uint32_t> region_name_map;
1470         void update_region_name_map (boost::shared_ptr<Region>);
1471
1472         mutable Glib::Mutex region_lock;
1473         typedef std::map<PBD::ID,boost::shared_ptr<Region> > RegionList;
1474         RegionList regions;
1475
1476         void add_region (boost::shared_ptr<Region>);
1477         void region_changed (Change, boost::weak_ptr<Region>);
1478         void remove_region (boost::weak_ptr<Region>);
1479
1480         int load_regions (const XMLNode& node);
1481
1482         void route_group_changed ();
1483
1484         /* SOURCES */
1485
1486         mutable Glib::Mutex source_lock;
1487         typedef std::map<PBD::ID,boost::shared_ptr<Source> > SourceMap;
1488
1489         SourceMap sources;
1490
1491   public:
1492         SourceMap get_sources() { return sources; }
1493
1494   private:
1495         int load_sources (const XMLNode& node);
1496         XMLNode& get_sources_as_xml ();
1497
1498         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1499
1500         /* PLAYLISTS */
1501
1502         mutable Glib::Mutex playlist_lock;
1503         typedef std::set<boost::shared_ptr<Playlist> > PlaylistList;
1504         PlaylistList playlists;
1505         PlaylistList unused_playlists;
1506
1507         int load_playlists (const XMLNode&);
1508         int load_unused_playlists (const XMLNode&);
1509         void remove_playlist (boost::weak_ptr<Playlist>);
1510         void track_playlist (bool, boost::weak_ptr<Playlist>);
1511
1512         boost::shared_ptr<Playlist> playlist_factory (std::string name);
1513         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1514
1515         void playlist_length_changed ();
1516         void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
1517
1518         /* NAMED SELECTIONS */
1519
1520         mutable Glib::Mutex named_selection_lock;
1521         typedef std::set<NamedSelection *> NamedSelectionList;
1522         NamedSelectionList named_selections;
1523
1524         int load_named_selections (const XMLNode&);
1525
1526         NamedSelection *named_selection_factory (std::string name);
1527         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1528
1529         /* CURVES and AUTOMATION LISTS */
1530         std::map<PBD::ID, AutomationList*> automation_lists;
1531
1532         /* DEFAULT FADE CURVES */
1533
1534         float default_fade_steepness;
1535         float default_fade_msecs;
1536
1537         /* AUDITIONING */
1538
1539         boost::shared_ptr<Auditioner> auditioner;
1540         void set_audition (boost::shared_ptr<Region>);
1541         void non_realtime_set_audition ();
1542         boost::shared_ptr<Region> pending_audition_region;
1543
1544         /* EXPORT */
1545
1546         /* FLATTEN */
1547
1548         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1549
1550         /* INSERT AND SEND MANAGEMENT */
1551
1552         boost::dynamic_bitset<uint32_t> send_bitset;
1553         boost::dynamic_bitset<uint32_t> return_bitset;
1554         boost::dynamic_bitset<uint32_t> insert_bitset;
1555
1556         void add_processor (Processor *);
1557         void remove_processor (Processor *);
1558
1559         /* S/W RAID */
1560
1561         struct space_and_path {
1562                 uint32_t blocks; /* 4kB blocks */
1563                 std::string path;
1564
1565                 space_and_path() {
1566                         blocks = 0;
1567                 }
1568         };
1569
1570         struct space_and_path_ascending_cmp {
1571                 bool operator() (space_and_path a, space_and_path b) {
1572                         return a.blocks > b.blocks;
1573                 }
1574         };
1575
1576         void setup_raid_path (std::string path);
1577
1578         std::vector<space_and_path> session_dirs;
1579         std::vector<space_and_path>::iterator last_rr_session_dir;
1580         uint32_t _total_free_4k_blocks;
1581         Glib::Mutex space_lock;
1582
1583         std::string get_best_session_directory_for_new_source ();
1584         void refresh_disk_space ();
1585
1586         mutable gint _playback_load;
1587         mutable gint _capture_load;
1588         mutable gint _playback_load_min;
1589         mutable gint _capture_load_min;
1590
1591         /* I/O bundles */
1592
1593         SerializedRCUManager<BundleList> _bundles;
1594         XMLNode* _bundle_xml_node;
1595         int load_bundles (XMLNode const &);
1596
1597         void reverse_diskstream_buffers ();
1598
1599         UndoHistory                  _history;
1600         std::stack<UndoTransaction*> _current_trans;
1601
1602         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1603         GlobalRouteMeterState get_global_route_metering ();
1604
1605         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1606         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1607
1608         void set_global_mute (GlobalRouteBooleanState s, void *src);
1609         void set_global_solo (GlobalRouteBooleanState s, void *src);
1610         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1611
1612         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1613         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1614         void reset_jack_connection (jack_client_t* jack);
1615         void record_enable_change_all (bool yn);
1616
1617         XMLNode& state(bool);
1618
1619         /* click track */
1620
1621         struct Click {
1622                 nframes_t start;
1623                 nframes_t duration;
1624                 nframes_t offset;
1625                 const Sample *data;
1626
1627                 Click (nframes_t s, nframes_t d, const Sample *b)
1628                         : start (s), duration (d), data (b) { offset = 0; }
1629
1630                 void *operator new (size_t) {
1631                         return pool.alloc ();
1632                 };
1633
1634                 void operator delete(void *ptr, size_t /*size*/) {
1635                         pool.release (ptr);
1636                 }
1637
1638         private:
1639                 static Pool pool;
1640         };
1641
1642         typedef std::list<Click*> Clicks;
1643
1644         Clicks                 clicks;
1645         bool                  _clicking;
1646         boost::shared_ptr<IO> _click_io;
1647         Sample*                click_data;
1648         Sample*                click_emphasis_data;
1649         nframes_t              click_length;
1650         nframes_t              click_emphasis_length;
1651         mutable Glib::RWLock   click_lock;
1652
1653         static const Sample    default_click[];
1654         static const nframes_t default_click_length;
1655         static const Sample    default_click_emphasis[];
1656         static const nframes_t default_click_emphasis_length;
1657
1658         Click *get_click();
1659         void   setup_click_sounds (int which);
1660         void   clear_clicks ();
1661         void   click (nframes_t start, nframes_t nframes);
1662
1663         std::vector<Route*> master_outs;
1664
1665         /* range playback */
1666
1667         std::list<AudioRange> current_audio_range;
1668         bool _play_range;
1669         void set_play_range (bool yn);
1670         void setup_auto_play ();
1671
1672         /* main outs */
1673         uint32_t main_outs;
1674
1675         boost::shared_ptr<Route> _master_out;
1676         boost::shared_ptr<Route> _control_out;
1677
1678         gain_t* _gain_automation_buffer;
1679         pan_t** _pan_automation_buffer;
1680         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1681         uint32_t _npan_buffers;
1682
1683         /* VST support */
1684
1685         long _vst_callback (VSTPlugin*,
1686                         long opcode,
1687                         long index,
1688                         long value,
1689                         void* ptr,
1690                         float opt);
1691
1692         /* number of hardware ports we're using,
1693            based on max (requested,available)
1694         */
1695
1696         uint32_t n_physical_outputs;
1697         uint32_t n_physical_inputs;
1698
1699         uint32_t n_physical_audio_outputs;
1700         uint32_t n_physical_audio_inputs;
1701
1702         uint32_t n_physical_midi_outputs;
1703         uint32_t n_physical_midi_inputs;
1704
1705         int find_all_sources (std::string path, std::set<std::string>& result);
1706         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1707
1708         typedef std::set<boost::shared_ptr<PBD::Controllable> > Controllables;
1709         Glib::Mutex controllables_lock;
1710         Controllables controllables;
1711
1712         void reset_native_file_format();
1713         bool first_file_data_format_reset;
1714         bool first_file_header_format_reset;
1715
1716         void config_changed (std::string, bool);
1717
1718         XMLNode& get_control_protocol_state ();
1719
1720         void set_history_depth (uint32_t depth);
1721         void sync_order_keys ();
1722
1723         static bool _disable_all_loaded_plugins;
1724
1725         SessionMetadata * _metadata;
1726
1727         mutable bool have_looped; ///< Used in ::audible_frame(*)
1728
1729         void update_have_rec_enabled_diskstream ();
1730         gint _have_rec_enabled_diskstream;
1731 };
1732
1733 } // namespace ARDOUR
1734
1735 #endif /* __ardour_session_h__ */