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