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