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