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