Compiles, but doesn't link. The link errors are mostly expected and are
[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); // not idempotent
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);
845         void commit_reversible_command (Command* cmd = 0);
846
847         void add_command (Command *const cmd) {
848                 current_trans.add_command (cmd);
849         }
850
851         // these commands are implemented in libs/ardour/session_command.cc
852         class GlobalSoloStateCommand : public Command
853         {
854             GlobalRouteBooleanState before, after;
855             void *src;
856         public:
857             GlobalSoloStateCommand(void *src);
858             void operator()();
859             void undo();
860             XMLNode &serialize();
861             void mark();
862         };
863
864         class GlobalMuteStateCommand : public Command
865         {
866             GlobalRouteBooleanState before, after;
867             void *src;
868         public:
869             GlobalMuteStateCommand(void *src);
870             void operator()();
871             void undo();
872             XMLNode &serialize();
873             void mark();
874         };
875
876         class GlobalRecordEnableStateCommand : public Command
877         {
878             GlobalRouteBooleanState before, after;
879             void *src;
880         public:
881             GlobalRecordEnableStateCommand(void *src);
882             void operator()();
883             void undo();
884             XMLNode &serialize();
885             void mark();
886         };
887
888         class GlobalMeteringStateCommand : public Command
889         {
890             GlobalRouteMeterState before, after;
891             void *src;
892         public:
893             GlobalMeteringStateCommand(void *src);
894             void operator()();
895             void undo();
896             XMLNode &serialize();
897             void mark();
898         };
899
900         /* edit mode */
901
902         void set_edit_mode (EditMode);
903         EditMode get_edit_mode () const { return _edit_mode; }
904
905         /* clicking */
906
907         IO&  click_io() { return *_click_io; }
908         void set_clicking (bool yn);
909         bool get_clicking() const;
910
911         void set_click_sound (string path);
912         void set_click_emphasis_sound (string path);
913                 
914         /* tempo FX */
915
916         struct TimeStretchRequest {
917             ARDOUR::AudioRegion* region;
918             float                fraction; /* session: read ; GUI: write */
919             float                progress; /* session: write ; GUI: read */
920             bool                 running;  /* read/write */
921             bool                 quick_seek; /* GUI: write */
922             bool                 antialias;  /* GUI: write */
923
924             TimeStretchRequest () : region (0) {}
925         };
926
927         AudioRegion* tempoize_region (TimeStretchRequest&);
928
929         string raid_path() const;
930         void   set_raid_path(string);
931
932         /* need to call this whenever we change native file formats */
933
934         void reset_native_file_format();
935
936         /* disk, buffer loads */
937
938         uint32_t playback_load ();
939         uint32_t capture_load ();
940         uint32_t playback_load_min ();
941         uint32_t capture_load_min ();
942
943         void reset_playback_load_min ();
944         void reset_capture_load_min ();
945         
946         float read_data_rate () const;
947         float write_data_rate () const;
948
949         /* ranges */
950
951         void set_audio_range (list<AudioRange>&);
952         void set_music_range (list<MusicRange>&);
953
954         void request_play_range (bool yn);
955         bool get_play_range () const { return _play_range; }
956
957         /* favorite dirs */
958         typedef vector<string> FavoriteDirs;
959
960         static int read_favorite_dirs (FavoriteDirs&);
961
962         static int write_favorite_dirs (FavoriteDirs&);
963         
964         /* file suffixes */
965
966         static const char* template_suffix() { return _template_suffix; }
967         static const char* statefile_suffix() { return _statefile_suffix; }
968         static const char* pending_suffix() { return _pending_suffix; }
969
970         /* buffers for gain and pan */
971
972         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
973         pan_t** pan_automation_buffer() const { return _pan_automation_buffer; }
974
975         /* buffers for conversion */
976         enum RunContext {
977                 ButlerContext = 0,
978                 TransportContext,
979                 ExportContext
980         };
981         
982         char *  conversion_buffer(RunContext context) { return _conversion_buffers[context]; }
983         
984         /* VST support */
985
986         static long vst_callback (AEffect* effect,
987                                   long opcode,
988                                   long index,
989                                   long value,
990                                   void* ptr,
991                                   float opt);
992
993         typedef float (*compute_peak_t)                         (Sample *, jack_nframes_t, float);
994         typedef void  (*apply_gain_to_buffer_t)         (Sample *, jack_nframes_t, float);
995         typedef void  (*mix_buffers_with_gain_t)        (Sample *, Sample *, jack_nframes_t, float);
996         typedef void  (*mix_buffers_no_gain_t)          (Sample *, Sample *, jack_nframes_t);
997
998         static compute_peak_t                   compute_peak;
999         static apply_gain_to_buffer_t   apply_gain_to_buffer;
1000         static mix_buffers_with_gain_t  mix_buffers_with_gain;
1001         static mix_buffers_no_gain_t    mix_buffers_no_gain;
1002         
1003   protected:
1004         friend class AudioEngine;
1005         void set_block_size (jack_nframes_t nframes);
1006         void set_frame_rate (jack_nframes_t nframes);
1007
1008   protected:
1009         friend class AudioDiskstream;
1010         void stop_butler ();
1011         void wait_till_butler_finished();
1012
1013   protected:
1014         friend class Route;
1015         void schedule_curve_reallocation ();
1016         void update_latency_compensation (bool, bool);
1017         
1018   private:
1019         int  create (bool& new_session, string* mix_template, jack_nframes_t initial_length);
1020
1021         static const char* _template_suffix;
1022         static const char* _statefile_suffix;
1023         static const char* _pending_suffix;
1024
1025         enum SubState {
1026                 PendingDeclickIn   = 0x1,
1027                 PendingDeclickOut  = 0x2,
1028                 StopPendingCapture = 0x4,
1029                 AutoReturning      = 0x10,
1030                 PendingLocate      = 0x20,
1031                 PendingSetLoop     = 0x40
1032         };
1033
1034         /* stuff used in process() should be close together to
1035            maximise cache hits
1036         */
1037
1038         typedef void (Session::*process_function_type)(jack_nframes_t);
1039
1040         AudioEngine            &_engine;
1041         mutable gint            processing_prohibited;
1042         process_function_type    process_function;
1043         process_function_type    last_process_function;
1044         jack_nframes_t          _current_frame_rate;
1045         int                      transport_sub_state;
1046         mutable gint           _record_status;
1047         jack_nframes_t          _transport_frame;
1048         Location*                end_location;
1049         Location*                start_location;
1050         Slave                  *_slave;
1051         SlaveSource             _slave_type;
1052         volatile float          _transport_speed;
1053         volatile float          _desired_transport_speed;
1054         float                   _last_transport_speed;
1055         jack_nframes_t          _last_slave_transport_frame;
1056         jack_nframes_t           maximum_output_latency;
1057         jack_nframes_t           last_stop_frame;
1058         vector<Sample *>        _passthru_buffers;
1059         vector<Sample *>        _silent_buffers;
1060         vector<Sample *>        _send_buffers;
1061         map<RunContext,char*>   _conversion_buffers;
1062         jack_nframes_t           current_block_size;
1063         jack_nframes_t          _worst_output_latency;
1064         jack_nframes_t          _worst_input_latency;
1065         jack_nframes_t          _worst_track_latency;
1066         bool                    _have_captured;
1067         float                   _meter_hold;
1068         float                   _meter_falloff;
1069         bool                    _end_location_is_free;
1070
1071         void set_worst_io_latencies (bool take_lock);
1072         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1073                 set_worst_io_latencies (true);
1074         }
1075
1076         void update_latency_compensation_proxy (void* ignored);
1077
1078         void ensure_passthru_buffers (uint32_t howmany);
1079         
1080         void process_scrub          (jack_nframes_t);
1081         void process_without_events (jack_nframes_t);
1082         void process_with_events    (jack_nframes_t);
1083         void process_audition       (jack_nframes_t);
1084         int  process_export         (jack_nframes_t, ARDOUR::AudioExportSpecification*);
1085         
1086         /* slave tracking */
1087
1088         static const int delta_accumulator_size = 25;
1089         int delta_accumulator_cnt;
1090         long delta_accumulator[delta_accumulator_size];
1091         long average_slave_delta;
1092         int  average_dir;
1093         bool have_first_delta_accumulator;
1094         
1095         enum SlaveState {
1096                 Stopped,
1097                 Waiting,
1098                 Running
1099         };
1100         
1101         SlaveState slave_state;
1102         jack_nframes_t slave_wait_end;
1103
1104         void reset_slave_state ();
1105         bool follow_slave (jack_nframes_t, jack_nframes_t);
1106
1107         bool _exporting;
1108         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1109
1110         void prepare_diskstreams ();
1111         void commit_diskstreams (jack_nframes_t, bool& session_requires_butler);
1112         int  process_routes (jack_nframes_t, jack_nframes_t);
1113         int  silent_process_routes (jack_nframes_t, jack_nframes_t);
1114
1115         bool get_rec_monitors_input () {
1116                 if (actively_recording()) {
1117                         return true;
1118                 } else {
1119                         if (auto_input) {
1120                                 return false;
1121                         } else {
1122                                 return true;
1123                         }
1124                 }
1125         }
1126
1127         int get_transport_declick_required () {
1128
1129                 if (transport_sub_state & PendingDeclickIn) {
1130                         transport_sub_state &= ~PendingDeclickIn;
1131                         return 1;
1132                 } else if (transport_sub_state & PendingDeclickOut) {
1133                         return -1;
1134                 } else {
1135                         return 0;
1136                 }
1137         }
1138
1139         bool maybe_stop (jack_nframes_t limit) {
1140                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1141                         stop_transport ();
1142                         return true;
1143                 }
1144                 return false;
1145         }
1146
1147         void check_declick_out ();
1148
1149         MIDI::MachineControl*    mmc;
1150         MIDI::Port*             _mmc_port;
1151         MIDI::Port*             _mtc_port;
1152         MIDI::Port*             _midi_port;
1153         string                  _path;
1154         string                  _name;
1155         bool                     do_not_record_plugins;
1156
1157         /* toggles */
1158
1159         bool auto_play;
1160         bool punch_in;
1161         bool punch_out;
1162         bool auto_loop;
1163         bool seamless_loop;
1164         bool loop_changing;
1165         jack_nframes_t last_loopend;
1166         bool auto_input;
1167         bool crossfades_active;
1168         bool all_safe;
1169         bool auto_return;
1170         bool monitor_in;
1171         bool send_mtc;
1172         bool send_mmc;
1173         bool mmc_control;
1174         bool midi_control;
1175
1176         RingBuffer<Event*> pending_events;
1177
1178         void hookup_io ();
1179         void when_engine_running ();
1180         sigc::connection first_time_running;
1181         void graph_reordered ();
1182
1183         string _current_snapshot_name;
1184
1185         XMLTree* state_tree;
1186         bool     state_was_pending;
1187         StateOfTheState _state_of_the_state;
1188
1189         void     auto_save();
1190         int      load_options (const XMLNode&);
1191         XMLNode& get_options () const;
1192         int      load_state (string snapshot_name);
1193
1194         jack_nframes_t   _last_roll_location;
1195         jack_nframes_t   _last_record_location;
1196         bool              pending_locate_roll;
1197         jack_nframes_t    pending_locate_frame;
1198
1199         bool              pending_locate_flush;
1200         bool              pending_abort;
1201         bool              pending_auto_loop;
1202         
1203         Sample*           butler_mixdown_buffer;
1204         float*            butler_gain_buffer;
1205         pthread_t         butler_thread;
1206         Glib::Mutex       butler_request_lock;
1207         Glib::Cond        butler_paused;
1208         bool              butler_should_run;
1209         mutable gint      butler_should_do_transport_work;
1210         int               butler_request_pipe[2];
1211         
1212         struct ButlerRequest {
1213             enum Type {
1214                     Wake,
1215                     Run,
1216                     Pause,
1217                     Quit
1218             };
1219         };
1220
1221         enum PostTransportWork {
1222                 PostTransportStop               = 0x1,
1223                 PostTransportDisableRecord      = 0x2,
1224                 PostTransportPosition           = 0x8,
1225                 PostTransportDidRecord          = 0x20,
1226                 PostTransportDuration           = 0x40,
1227                 PostTransportLocate             = 0x80,
1228                 PostTransportRoll               = 0x200,
1229                 PostTransportAbort              = 0x800,
1230                 PostTransportOverWrite          = 0x1000,
1231                 PostTransportSpeed              = 0x2000,
1232                 PostTransportAudition           = 0x4000,
1233                 PostTransportScrub              = 0x8000,
1234                 PostTransportReverse            = 0x10000,
1235                 PostTransportInputChange        = 0x20000,
1236                 PostTransportCurveRealloc       = 0x40000
1237         };
1238         
1239         static const PostTransportWork ProcessCannotProceedMask = 
1240                 PostTransportWork (PostTransportInputChange|
1241                                    PostTransportSpeed|
1242                                    PostTransportReverse|
1243                                    PostTransportCurveRealloc|
1244                                    PostTransportScrub|
1245                                    PostTransportAudition|
1246                                    PostTransportLocate|
1247                                    PostTransportStop);
1248         
1249         PostTransportWork post_transport_work;
1250
1251         void             summon_butler ();
1252         void             schedule_butler_transport_work ();
1253         int              start_butler_thread ();
1254         void             terminate_butler_thread ();
1255         static void    *_butler_thread_work (void *arg);
1256         void*            butler_thread_work ();
1257
1258         uint32_t    cumulative_rf_motion;
1259         uint32_t    rf_scale;
1260
1261         void set_rf_speed (float speed);
1262         void reset_rf_scale (jack_nframes_t frames_moved);
1263
1264         Locations        _locations;
1265         void              locations_changed ();
1266         void              locations_added (Location*);
1267         void              handle_locations_changed (Locations::LocationList&);
1268
1269         sigc::connection auto_punch_start_changed_connection;
1270         sigc::connection auto_punch_end_changed_connection;
1271         sigc::connection auto_punch_changed_connection;
1272         void             auto_punch_start_changed (Location *);
1273         void             auto_punch_end_changed (Location *);
1274         void             auto_punch_changed (Location *);
1275
1276         sigc::connection auto_loop_start_changed_connection;
1277         sigc::connection auto_loop_end_changed_connection;
1278         sigc::connection auto_loop_changed_connection;
1279         void             auto_loop_changed (Location *);
1280
1281         typedef list<Event *> Events;
1282         Events           events;
1283         Events           immediate_events;
1284         Events::iterator next_event;
1285
1286         /* there can only ever be one of each of these */
1287
1288         Event *auto_loop_event;
1289         Event *punch_out_event;
1290         Event *punch_in_event;
1291
1292         /* events */
1293
1294         void dump_events () const;
1295         void queue_event (Event *ev);
1296         void merge_event (Event*);
1297         void replace_event (Event::Type, jack_nframes_t action_frame, jack_nframes_t target = 0);
1298         bool _replace_event (Event*);
1299         bool _remove_event (Event *);
1300         void _clear_event_type (Event::Type);
1301
1302         void first_stage_init (string path, string snapshot_name);
1303         int  second_stage_init (bool new_tracks);
1304         void find_current_end ();
1305         void remove_empty_sounds ();
1306
1307         void setup_midi_control ();
1308         int  midi_read (MIDI::Port *);
1309
1310         void enable_record ();
1311         
1312         void increment_transport_position (uint32_t val) {
1313                 if (max_frames - val < _transport_frame) {
1314                         _transport_frame = max_frames;
1315                 } else {
1316                         _transport_frame += val;
1317                 }
1318         }
1319
1320         void decrement_transport_position (uint32_t val) {
1321                 if (val < _transport_frame) {
1322                         _transport_frame -= val;
1323                 } else {
1324                         _transport_frame = 0;
1325                 }
1326         }
1327
1328         void post_transport_motion ();
1329         static void *session_loader_thread (void *arg);
1330
1331         void *do_work();
1332
1333         void set_next_event ();
1334         void process_event (Event *);
1335
1336         /* MIDI Machine Control */
1337
1338         void deliver_mmc (MIDI::MachineControl::Command, jack_nframes_t);
1339         void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1340         void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1341
1342         void spp_start (MIDI::Parser&);
1343         void spp_continue (MIDI::Parser&);
1344         void spp_stop (MIDI::Parser&);
1345
1346         void mmc_deferred_play (MIDI::MachineControl &);
1347         void mmc_stop (MIDI::MachineControl &);
1348         void mmc_step (MIDI::MachineControl &, int);
1349         void mmc_pause (MIDI::MachineControl &);
1350         void mmc_record_pause (MIDI::MachineControl &);
1351         void mmc_record_strobe (MIDI::MachineControl &);
1352         void mmc_record_exit (MIDI::MachineControl &);
1353         void mmc_track_record_status (MIDI::MachineControl &, 
1354                                       uint32_t track, bool enabled);
1355         void mmc_fast_forward (MIDI::MachineControl &);
1356         void mmc_rewind (MIDI::MachineControl &);
1357         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1358         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1359         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1360
1361         struct timeval last_mmc_step;
1362         double step_speed;
1363
1364         typedef sigc::slot<bool> MidiTimeoutCallback;
1365         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1366
1367         MidiTimeoutList midi_timeouts;
1368         bool mmc_step_timeout ();
1369
1370         MIDI::byte mmc_buffer[32];
1371         MIDI::byte mtc_msg[16];
1372         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1373         MIDI::byte midi_msg[16];
1374         jack_nframes_t  outbound_mtc_smpte_frame;
1375         SMPTE::Time transmitting_smpte_time;
1376         int next_quarter_frame_to_send;
1377         
1378         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1379         jack_nframes_t _frames_per_hour;
1380         jack_nframes_t _smpte_frames_per_hour;
1381         jack_nframes_t _smpte_offset;
1382         bool _smpte_offset_negative;
1383         
1384         /* cache the most-recently requested time conversions.
1385            this helps when we have multiple clocks showing the
1386            same time (e.g. the transport frame)
1387         */
1388
1389         bool       last_smpte_valid;
1390         jack_nframes_t  last_smpte_when;
1391         SMPTE::Time last_smpte;
1392
1393         int send_full_time_code ();
1394         int send_midi_time_code ();
1395
1396         void send_full_time_code_in_another_thread ();
1397         void send_midi_time_code_in_another_thread ();
1398         void send_time_code_in_another_thread (bool full);
1399         void send_mmc_in_another_thread (MIDI::MachineControl::Command, jack_nframes_t frame = 0);
1400
1401         jack_nframes_t adjust_apparent_position (jack_nframes_t frames);
1402         
1403         void reset_record_status ();
1404         
1405         int no_roll (jack_nframes_t nframes, jack_nframes_t offset);
1406         
1407         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1408         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1409
1410         struct MIDIRequest {
1411             
1412             enum Type {
1413                     SendFullMTC,
1414                     SendMTC,
1415                     SendMMC,
1416                     PortChange,
1417                     SendMessage,
1418                     Deliver,
1419                     Quit
1420             };
1421             
1422             Type type;
1423             MIDI::MachineControl::Command mmc_cmd;
1424             jack_nframes_t locate_frame;
1425
1426             // for SendMessage type
1427
1428             MIDI::Port * port;
1429             MIDI::channel_t chan;
1430             union {
1431                 MIDI::EventTwoBytes data;
1432                 MIDI::byte* buf;
1433             };
1434
1435             union { 
1436                 MIDI::eventType ev;
1437                 int32_t size;
1438             };
1439
1440             MIDIRequest () {}
1441             
1442             void *operator new(size_t ignored) {
1443                     return pool.alloc ();
1444             };
1445
1446             void operator delete(void *ptr, size_t size) {
1447                     pool.release (ptr);
1448             }
1449
1450           private:
1451             static MultiAllocSingleReleasePool pool;
1452         };
1453
1454         Glib::Mutex       midi_lock;
1455         pthread_t       midi_thread;
1456         int             midi_request_pipe[2];
1457         mutable  gint   butler_active;
1458         RingBuffer<MIDIRequest*> midi_requests;
1459
1460         int           start_midi_thread ();
1461         void          terminate_midi_thread ();
1462         void          poke_midi_thread ();
1463         static void *_midi_thread_work (void *arg);
1464         void          midi_thread_work ();
1465         void          change_midi_ports ();
1466         int           use_config_midi_ports ();
1467
1468         bool waiting_to_start;
1469
1470         void set_auto_loop (bool yn);
1471         void overwrite_some_buffers (AudioDiskstream*);
1472         void flush_all_redirects ();
1473         void locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1474         void start_locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1475         void force_locate (jack_nframes_t frame, bool with_roll = false);
1476         void set_diskstream_speed (AudioDiskstream*, float speed);
1477         void set_transport_speed (float speed, bool abort = false);
1478         void stop_transport (bool abort = false);
1479         void start_transport ();
1480         void actually_start_transport ();
1481         void realtime_stop (bool abort);
1482         void non_realtime_start_scrub ();
1483         void non_realtime_set_speed ();
1484         void non_realtime_stop (bool abort);
1485         void non_realtime_overwrite ();
1486         void non_realtime_buffer_fill ();
1487         void butler_transport_work ();
1488         void post_transport ();
1489         void engine_halted ();
1490         void xrun_recovery ();
1491
1492         TempoMap    *_tempo_map;
1493         void          tempo_map_changed (Change);
1494
1495         /* edit/mix groups */
1496
1497         int load_route_groups (const XMLNode&, bool is_edit);
1498         int load_edit_groups (const XMLNode&);
1499         int load_mix_groups (const XMLNode&);
1500
1501
1502         list<RouteGroup *> edit_groups;
1503         list<RouteGroup *> mix_groups;
1504
1505         /* disk-streams */
1506
1507         AudioDiskstreamList  audio_diskstreams; 
1508         mutable Glib::RWLock diskstream_lock;
1509         uint32_t dstream_buffer_size;
1510         void add_diskstream (AudioDiskstream*);
1511         int  load_diskstreams (const XMLNode&);
1512
1513         /* routes stuff */
1514
1515         RouteList       routes;
1516         mutable Glib::RWLock route_lock;
1517         void   add_route (Route*);
1518         uint32_t destructive_index;
1519
1520         int load_routes (const XMLNode&);
1521         Route* XMLRouteFactory (const XMLNode&);
1522
1523         /* mixer stuff */
1524
1525         bool      _solo_latched;
1526         SoloModel _solo_model;
1527         bool       solo_update_disabled;
1528         bool       currently_soloing;
1529         
1530         void route_mute_changed (void *src);
1531         void route_solo_changed (void *src, Route *);
1532         void catch_up_on_solo ();
1533         void update_route_solo_state ();
1534         void modify_solo_mute (bool, bool);
1535         void strip_portname_for_solo (string& portname);
1536
1537         /* REGION MANAGEMENT */
1538
1539         mutable Glib::Mutex region_lock;
1540         typedef map<ARDOUR::id_t,AudioRegion *> AudioRegionList;
1541         AudioRegionList audio_regions;
1542         
1543         void region_renamed (Region *);
1544         void region_changed (Change, Region *);
1545         void add_region (Region *);
1546         void remove_region (Region *);
1547
1548         int load_regions (const XMLNode& node);
1549
1550         /* SOURCES */
1551         
1552         mutable Glib::Mutex audio_source_lock;
1553         typedef std::map<id_t, AudioSource *>    AudioSourceList;
1554
1555         AudioSourceList audio_sources;
1556
1557         int load_sources (const XMLNode& node);
1558         XMLNode& get_sources_as_xml ();
1559
1560         Source *XMLSourceFactory (const XMLNode&);
1561
1562         /* PLAYLISTS */
1563         
1564         mutable Glib::Mutex playlist_lock;
1565         typedef set<Playlist *> PlaylistList;
1566         PlaylistList playlists;
1567         PlaylistList unused_playlists;
1568
1569         int load_playlists (const XMLNode&);
1570         int load_unused_playlists (const XMLNode&);
1571         void remove_playlist (Playlist *);
1572         void track_playlist (Playlist *, bool);
1573
1574         Playlist *playlist_factory (string name);
1575         Playlist *XMLPlaylistFactory (const XMLNode&);
1576
1577         void playlist_length_changed (Playlist *);
1578         void diskstream_playlist_changed (AudioDiskstream *);
1579
1580         /* NAMED SELECTIONS */
1581
1582         mutable Glib::Mutex named_selection_lock;
1583         typedef set<NamedSelection *> NamedSelectionList;
1584         NamedSelectionList named_selections;
1585
1586         int load_named_selections (const XMLNode&);
1587
1588         NamedSelection *named_selection_factory (string name);
1589         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1590
1591         /* DEFAULT FADE CURVES */
1592
1593         float default_fade_steepness;
1594         float default_fade_msecs;
1595
1596         /* AUDITIONING */
1597
1598         Auditioner *auditioner;
1599         void set_audition (AudioRegion*);
1600         void non_realtime_set_audition ();
1601         AudioRegion *pending_audition_region;
1602
1603         /* EXPORT */
1604
1605         /* FLATTEN */
1606
1607         int flatten_one_track (AudioTrack&, jack_nframes_t start, jack_nframes_t cnt);
1608
1609         /* INSERT AND SEND MANAGEMENT */
1610         
1611         list<PortInsert *>   _port_inserts;
1612         list<PluginInsert *> _plugin_inserts;
1613         list<Send *>         _sends;
1614         uint32_t          send_cnt;
1615         uint32_t          insert_cnt;
1616
1617         void add_redirect (Redirect *);
1618         void remove_redirect (Redirect *);
1619
1620         /* S/W RAID */
1621
1622         struct space_and_path {
1623             uint32_t blocks; /* 4kB blocks */
1624             string path;
1625             
1626             space_and_path() { 
1627                     blocks = 0;
1628             }
1629         };
1630
1631         struct space_and_path_ascending_cmp {
1632             bool operator() (space_and_path a, space_and_path b) {
1633                     return a.blocks > b.blocks;
1634             }
1635         };
1636         
1637         void setup_raid_path (string path);
1638
1639         vector<space_and_path> session_dirs;
1640         vector<space_and_path>::iterator last_rr_session_dir;
1641         uint32_t _total_free_4k_blocks;
1642         Glib::Mutex space_lock;
1643
1644         static const char* sound_dir_name;
1645         static const char* tape_dir_name;
1646         static const char* dead_sound_dir_name;
1647         static const char* peak_dir_name;
1648
1649         string discover_best_sound_dir (bool destructive = false);
1650         int ensure_sound_dir (string, string&);
1651         void refresh_disk_space ();
1652
1653         mutable gint _playback_load;
1654         mutable gint _capture_load;
1655         mutable gint _playback_load_min;
1656         mutable gint _capture_load_min;
1657
1658         /* I/O Connections */
1659
1660         typedef list<Connection *> ConnectionList;
1661         mutable Glib::Mutex connection_lock;
1662         ConnectionList _connections;
1663         int load_connections (const XMLNode&);
1664
1665         int set_slave_source (SlaveSource, jack_nframes_t);
1666
1667         void reverse_diskstream_buffers ();
1668
1669         UndoHistory history;
1670         UndoTransaction current_trans;
1671
1672         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1673         GlobalRouteMeterState get_global_route_metering ();
1674
1675         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1676         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1677
1678         void set_global_mute (GlobalRouteBooleanState s, void *src);
1679         void set_global_solo (GlobalRouteBooleanState s, void *src);
1680         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1681
1682         void jack_timebase_callback (jack_transport_state_t, jack_nframes_t, jack_position_t*, int);
1683         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1684         void record_enable_change_all (bool yn);
1685
1686         XMLNode& state(bool);
1687
1688         /* click track */
1689
1690         struct Click {
1691             jack_nframes_t start;
1692             jack_nframes_t duration;
1693             jack_nframes_t offset;
1694             const Sample *data;
1695
1696             Click (jack_nframes_t s, jack_nframes_t d, const Sample *b) 
1697                     : start (s), duration (d), data (b) { offset = 0; }
1698             
1699             void *operator new(size_t ignored) {
1700                     return pool.alloc ();
1701             };
1702
1703             void operator delete(void *ptr, size_t size) {
1704                     pool.release (ptr);
1705             }
1706
1707           private:
1708             static Pool pool;
1709         };
1710  
1711         typedef list<Click*> Clicks;
1712
1713         Clicks          clicks;
1714         bool           _clicking;
1715         IO*            _click_io;
1716         Sample*         click_data;
1717         Sample*         click_emphasis_data;
1718         jack_nframes_t  click_length;
1719         jack_nframes_t  click_emphasis_length;
1720         mutable Glib::RWLock click_lock;
1721
1722         static const Sample         default_click[];
1723         static const jack_nframes_t default_click_length;
1724         static const Sample         default_click_emphasis[];
1725         static const jack_nframes_t default_click_emphasis_length;
1726
1727         Click *get_click();
1728         void   setup_click_sounds (int which);
1729         void   clear_clicks ();
1730         void   click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t offset);
1731
1732         vector<Route*> master_outs;
1733         
1734         EditMode _edit_mode;
1735         EditMode pending_edit_mode;
1736
1737         /* range playback */
1738
1739         list<AudioRange> current_audio_range;
1740         bool _play_range;
1741         void set_play_range (bool yn);
1742         void setup_auto_play ();
1743
1744         /* main outs */
1745         uint32_t main_outs;
1746         
1747         IO* _master_out;
1748         IO* _control_out;
1749
1750         AutoConnectOption input_auto_connect;
1751         AutoConnectOption output_auto_connect;
1752
1753         gain_t* _gain_automation_buffer;
1754         pan_t** _pan_automation_buffer;
1755         void allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force);
1756         uint32_t _npan_buffers;
1757
1758         /* VST support */
1759
1760         long _vst_callback (VSTPlugin*,
1761                             long opcode,
1762                             long index,
1763                             long value,
1764                             void* ptr,
1765                             float opt);
1766
1767         /* number of hardware audio ports we're using,
1768            based on max (requested,available)
1769         */
1770
1771         uint32_t n_physical_outputs;
1772         uint32_t n_physical_inputs;
1773
1774         void remove_pending_capture_state ();
1775
1776         int find_all_sources (std::string path, std::set<std::string>& result);
1777         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1778
1779         LayerModel layer_model;
1780         CrossfadeModel xfade_model;
1781 };
1782
1783 }; /* namespace ARDOUR */
1784
1785 #endif /* __ardour_session_h__ */