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