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