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