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