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