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