Can pass a core to ardbg now. Fixed sometimes crash on saving history by
[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         Diskstream* diskstream_by_id (const PBD::ID& id);
274         Diskstream* diskstream_by_name (string name);
275
276         bool have_captured() const { return _have_captured; }
277
278         void refill_all_diskstream_buffers ();
279         uint32_t diskstream_buffer_size() const { return dstream_buffer_size; }
280         
281         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
282         uint32_t n_diskstreams() const;
283         
284         typedef list<Diskstream *> DiskstreamList;
285
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_remote_id (uint32_t id);
306
307         bool route_name_unique (string) const;
308
309         bool get_record_enabled() const { 
310                 return (record_status () >= Enabled);
311         }
312
313         RecordState record_status() const {
314                 return (RecordState) g_atomic_int_get (&_record_status);
315         }
316
317         bool actively_recording () {
318                 return record_status() == Recording;
319         }
320
321         bool record_enabling_legal () const;
322         void maybe_enable_record ();
323         void disable_record (bool rt_context, bool force = false);
324         void step_back_from_record ();
325         
326         sigc::signal<void> going_away;
327
328         /* Proxy signal for region hidden changes */
329
330         sigc::signal<void,Region*> RegionHiddenChange;
331
332         /* Emitted when all i/o connections are complete */
333         
334         sigc::signal<void> IOConnectionsComplete;
335         
336         /* Record status signals */
337
338         sigc::signal<void> RecordStateChanged;
339
340         /* Transport mechanism signals */
341
342         sigc::signal<void> TransportStateChange; /* generic */
343         sigc::signal<void,jack_nframes_t> PositionChanged; /* sent after any non-sequential motion */
344         sigc::signal<void> DurationChanged;
345         sigc::signal<void> HaltOnXrun;
346
347         sigc::signal<void,boost::shared_ptr<Route> > RouteAdded;
348         sigc::signal<void,Diskstream*> DiskstreamAdded; // FIXME: make a shared_ptr
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 ();
481
482         static int rename_template (string old_name, string new_name);
483
484         static int delete_template (string name);
485         
486         sigc::signal<void,string> StateSaved;
487         sigc::signal<void> StateReady;
488
489         vector<string*>* possible_states() const;
490         static vector<string*>* possible_states(string path);
491
492         XMLNode& get_state();
493         int      set_state(const XMLNode& node); // not idempotent
494         XMLNode& get_template();
495
496         void add_instant_xml (XMLNode&, const std::string& dir);
497
498         enum StateOfTheState {
499                 Clean = 0x0,
500                 Dirty = 0x1,
501                 CannotSave = 0x2,
502                 Deletion = 0x4,
503                 InitialConnecting = 0x8,
504                 Loading = 0x10,
505                 InCleanup = 0x20
506         };
507
508         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
509
510         RouteGroup* add_edit_group (string);
511         RouteGroup* add_mix_group (string);
512
513         void remove_edit_group (RouteGroup&);
514         void remove_mix_group (RouteGroup&);
515
516         RouteGroup *mix_group_by_name (string);
517         RouteGroup *edit_group_by_name (string);
518
519         sigc::signal<void,RouteGroup*> edit_group_added;
520         sigc::signal<void,RouteGroup*> mix_group_added;
521         sigc::signal<void> edit_group_removed;
522         sigc::signal<void> mix_group_removed;
523
524         void foreach_edit_group (sigc::slot<void,RouteGroup*> sl) {
525                 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) {
526                         sl (*i);
527                 }
528         }
529
530         void foreach_mix_group (sigc::slot<void,RouteGroup*> sl) {
531                 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); i++) {
532                         sl (*i);
533                 }
534         }
535
536         /* fundamental operations. duh. */
537
538         boost::shared_ptr<AudioTrack> new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal);
539         boost::shared_ptr<Route>      new_audio_route (int input_channels, int output_channels);
540
541         void   remove_route (boost::shared_ptr<Route>);
542
543         void   resort_routes ();
544         void   resort_routes_using (boost::shared_ptr<RouteList>);
545
546         AudioEngine &engine() { return _engine; };
547
548         /* configuration. there should really be accessors/mutators
549            for these 
550         */
551
552         float   meter_hold () { return _meter_hold; }
553         void    set_meter_hold (float);
554         sigc::signal<void> MeterHoldChanged;
555
556         float   meter_falloff () { return _meter_falloff; }
557         void    set_meter_falloff (float);
558         sigc::signal<void> MeterFalloffChanged;
559         
560         int32_t  max_level;
561         int32_t  min_level;
562         string  click_emphasis_sound;
563         string  click_sound;
564         bool    click_requested;
565         jack_nframes_t over_length_short;
566         jack_nframes_t over_length_long;
567         bool    send_midi_timecode;
568         bool    send_midi_machine_control;
569         float   shuttle_speed_factor;
570         float   shuttle_speed_threshold;
571         float   rf_speed;
572         float   smpte_frames_per_second;
573         bool    smpte_drop_frames;
574         AnyTime preroll;
575         AnyTime postroll;
576         
577         /* Time */
578
579         jack_nframes_t transport_frame () const {return _transport_frame; }
580         jack_nframes_t audible_frame () const;
581
582         int  set_smpte_type (float fps, bool drop_frames);
583
584         void bbt_time (jack_nframes_t when, BBT_Time&);
585         void smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const;
586         void sample_to_smpte( jack_nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
587         void smpte_time (SMPTE::Time &);
588         void smpte_time (jack_nframes_t when, SMPTE::Time&);
589         void smpte_time_subframes (jack_nframes_t when, SMPTE::Time&);
590
591         void smpte_duration (jack_nframes_t, SMPTE::Time&) const;
592         void smpte_duration_string (char *, jack_nframes_t) const;
593
594         void           set_smpte_offset (jack_nframes_t);
595         jack_nframes_t smpte_offset () const { return _smpte_offset; }
596         void           set_smpte_offset_negative (bool);
597         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
598
599         jack_nframes_t convert_to_frames_at (jack_nframes_t position, AnyTime&);
600
601         static sigc::signal<void> SMPTEOffsetChanged;
602         sigc::signal<void> SMPTETypeChanged;
603
604         void        request_slave_source (SlaveSource, jack_nframes_t pos = 0);
605         SlaveSource slave_source() const { return _slave_type; }
606         bool        synced_to_jack() const { return _slave_type == JACK; }
607         float       transport_speed() const { return _transport_speed; }
608         bool        transport_stopped() const { return _transport_speed == 0.0f; }
609         bool        transport_rolling() const { return _transport_speed != 0.0f; }
610
611         int jack_slave_sync (jack_nframes_t);
612
613         TempoMap& tempo_map() { return *_tempo_map; }
614         
615         /* region info  */
616
617         sigc::signal<void,AudioRegion *> AudioRegionAdded;
618         sigc::signal<void,AudioRegion *> AudioRegionRemoved;
619
620         int region_name (string& result, string base = string(""), bool newlevel = false) const;
621         string new_region_name (string);
622         string path_from_region_name (string name, string identifier);
623
624         AudioRegion* find_whole_file_parent (AudioRegion&);
625         void find_equivalent_playlist_regions (Region&, std::vector<Region*>& result);
626
627         AudioRegion *XMLRegionFactory (const XMLNode&, bool full);
628
629         template<class T> void foreach_audio_region (T *obj, void (T::*func)(AudioRegion *));
630
631         /* source management */
632
633         struct import_status : public InterThreadInfo {
634             string doing_what;
635             
636             /* control info */
637             bool multichan;
638             bool sample_convert;
639             volatile bool freeze;
640             string pathname;
641             
642             /* result */
643             std::vector<AudioRegion*> new_regions;
644             
645         };
646
647         int import_audiofile (import_status&);
648         bool sample_rate_convert (import_status&, string infile, string& outfile);
649         string build_tmp_convert_name (string file);
650
651         Session::SlaveSource post_export_slave;
652         jack_nframes_t post_export_position;
653
654         int start_audio_export (ARDOUR::AudioExportSpecification&);
655         int stop_audio_export (ARDOUR::AudioExportSpecification&);
656         
657         void add_audio_source (AudioSource *);
658         void remove_source (Source *);
659         int  cleanup_audio_file_source (AudioFileSource&);
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         AudioFileSource *create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
692
693         Source *source_by_id (const PBD::ID&);
694
695         /* playlist management */
696
697         Playlist* playlist_by_name (string name);
698         void add_playlist (Playlist *);
699         sigc::signal<void,Playlist*> PlaylistAdded;
700         sigc::signal<void,Playlist*> PlaylistRemoved;
701
702         uint32_t n_playlists() const;
703
704         template<class T> void foreach_playlist (T *obj, void (T::*func)(Playlist *));
705
706         /* named selections */
707
708         NamedSelection* named_selection_by_name (string name);
709         void add_named_selection (NamedSelection *);
710         void remove_named_selection (NamedSelection *);
711
712         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
713         sigc::signal<void> NamedSelectionAdded;
714         sigc::signal<void> NamedSelectionRemoved;
715
716         /* fade curves */
717
718         float get_default_fade_length () const { return default_fade_msecs; }
719         float get_default_fade_steepness () const { return default_fade_steepness; }
720         void set_default_fade (float steepness, float msecs);
721
722         /* auditioning */
723
724         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
725         void audition_playlist ();
726         void audition_region (Region&);
727         void cancel_audition ();
728         bool is_auditioning () const;
729         
730         sigc::signal<void,bool> AuditionActive;
731
732         /* flattening stuff */
733
734         int write_one_audio_track (AudioTrack&, jack_nframes_t start, jack_nframes_t cnt, bool overwrite, vector<AudioSource*>&,
735                                    InterThreadInfo& wot);
736         int freeze (InterThreadInfo&);
737
738         /* session-wide solo/mute/rec-enable */
739
740         enum SoloModel {
741                 InverseMute,
742                 SoloBus
743         };
744         
745         bool soloing() const { return currently_soloing; }
746
747         SoloModel solo_model() const { return _solo_model; }
748         void set_solo_model (SoloModel);
749
750         bool solo_latched() const { return _solo_latched; }
751         void set_solo_latched (bool yn);
752         
753         void set_all_solo (bool);
754         void set_all_mute (bool);
755
756         sigc::signal<void,bool> SoloActive;
757         
758         void record_disenable_all ();
759         void record_enable_all ();
760
761         /* control/master out */
762
763         boost::shared_ptr<IO> control_out() const { return _control_out; }
764         boost::shared_ptr<IO> master_out() const { return _master_out; }
765
766         /* insert/send management */
767         
768         uint32_t n_port_inserts() const { return _port_inserts.size(); }
769         uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); }
770         uint32_t n_sends() const { return _sends.size(); }
771
772         string next_send_name();
773         string next_insert_name();
774         
775         /* s/w "RAID" management */
776         
777         jack_nframes_t available_capture_duration();
778
779         /* I/O Connections */
780
781         template<class T> void foreach_connection (T *obj, void (T::*func)(Connection *));
782         void add_connection (Connection *);
783         void remove_connection (Connection *);
784         Connection *connection_by_name (string) const;
785
786         sigc::signal<void,Connection *> ConnectionAdded;
787         sigc::signal<void,Connection *> ConnectionRemoved;
788
789         /* MIDI */
790         
791         int set_mtc_port (string port_tag);
792         int set_mmc_port (string port_tag);
793         int set_midi_port (string port_tag);
794         MIDI::Port *mtc_port() const { return _mtc_port; }
795         MIDI::Port *mmc_port() const { return _mmc_port; }
796         MIDI::Port *midi_port() const { return _midi_port; }
797
798         sigc::signal<void> MTC_PortChanged;
799         sigc::signal<void> MMC_PortChanged;
800         sigc::signal<void> MIDI_PortChanged;
801
802         void set_trace_midi_input (bool, MIDI::Port* port = 0);
803         void set_trace_midi_output (bool, MIDI::Port* port = 0);
804
805         bool get_trace_midi_input(MIDI::Port *port = 0);
806         bool get_trace_midi_output(MIDI::Port *port = 0);
807         
808         void send_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
809
810         void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size);
811
812         /* Scrubbing */
813
814         void start_scrub (jack_nframes_t where);
815         void stop_scrub ();
816         void set_scrub_speed (float);
817         jack_nframes_t scrub_buffer_size() const;
818         sigc::signal<void> ScrubReady;
819
820         /* History (for editors, mixers, UIs etc.) */
821
822         void undo (uint32_t n) {
823                 history.undo (n);
824         }
825         void redo (uint32_t n) {
826                 history.redo (n);
827         }
828
829         uint32_t undo_depth() const { return history.undo_depth(); }
830         uint32_t redo_depth() const { return history.redo_depth(); }
831         string next_undo() const { return history.next_undo(); }
832         string next_redo() const { return history.next_redo(); }
833
834         void begin_reversible_command (string cmd_name);
835         void commit_reversible_command (Command* cmd = 0);
836
837         void add_command (Command *const cmd) {
838                 current_trans.add_command (cmd);
839         }
840
841         // these commands are implemented in libs/ardour/session_command.cc
842         Command *memento_command_factory(XMLNode *n);
843         class GlobalSoloStateCommand : public Command
844         {
845             GlobalRouteBooleanState before, after;
846             Session &sess;
847             void *src;
848         public:
849             GlobalSoloStateCommand(Session &, void *src);
850             void operator()();
851             void undo();
852             XMLNode &get_state();
853             void mark();
854         };
855
856         class GlobalMuteStateCommand : public Command
857         {
858             GlobalRouteBooleanState before, after;
859             Session &sess;
860             void *src;
861         public:
862             GlobalMuteStateCommand(Session &, void *src);
863             void operator()();
864             void undo();
865             XMLNode &get_state();
866             void mark();
867         };
868
869         class GlobalRecordEnableStateCommand : public Command
870         {
871             GlobalRouteBooleanState before, after;
872             Session &sess;
873             void *src;
874         public:
875             GlobalRecordEnableStateCommand(Session &, void *src);
876             void operator()();
877             void undo();
878             XMLNode &get_state();
879             void mark();
880         };
881
882         class GlobalMeteringStateCommand : public Command
883         {
884             GlobalRouteMeterState before, after;
885             Session &sess;
886             void *src;
887         public:
888             GlobalMeteringStateCommand(Session &, void *src);
889             void operator()();
890             void undo();
891             XMLNode &get_state();
892             void mark();
893         };
894
895         /* edit mode */
896
897         void set_edit_mode (EditMode);
898         EditMode get_edit_mode () const { return _edit_mode; }
899
900         /* clicking */
901
902         boost::shared_ptr<IO>  click_io() { return _click_io; }
903         void set_clicking (bool yn);
904         bool get_clicking() const;
905
906         void set_click_sound (string path);
907         void set_click_emphasis_sound (string path);
908                 
909         /* tempo FX */
910
911         struct TimeStretchRequest {
912             ARDOUR::AudioRegion* region;
913             float                fraction; /* session: read ; GUI: write */
914             float                progress; /* session: write ; GUI: read */
915             bool                 running;  /* read/write */
916             bool                 quick_seek; /* GUI: write */
917             bool                 antialias;  /* GUI: write */
918
919             TimeStretchRequest () : region (0) {}
920         };
921
922         AudioRegion* tempoize_region (TimeStretchRequest&);
923
924         string raid_path() const;
925         void   set_raid_path(string);
926
927         /* need to call this whenever we change native file formats */
928
929         void reset_native_file_format();
930
931         /* disk, buffer loads */
932
933         uint32_t playback_load ();
934         uint32_t capture_load ();
935         uint32_t playback_load_min ();
936         uint32_t capture_load_min ();
937
938         void reset_playback_load_min ();
939         void reset_capture_load_min ();
940         
941         float read_data_rate () const;
942         float write_data_rate () const;
943
944         /* ranges */
945
946         void set_audio_range (list<AudioRange>&);
947         void set_music_range (list<MusicRange>&);
948
949         void request_play_range (bool yn);
950         bool get_play_range () const { return _play_range; }
951
952         /* favorite dirs */
953         typedef vector<string> FavoriteDirs;
954
955         static int read_favorite_dirs (FavoriteDirs&);
956
957         static int write_favorite_dirs (FavoriteDirs&);
958         
959         /* file suffixes */
960
961         static const char* template_suffix() { return _template_suffix; }
962         static const char* statefile_suffix() { return _statefile_suffix; }
963         static const char* pending_suffix() { return _pending_suffix; }
964
965         /* buffers for gain and pan */
966
967         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
968         pan_t** pan_automation_buffer() const { return _pan_automation_buffer; }
969
970         /* buffers for conversion */
971         enum RunContext {
972                 ButlerContext = 0,
973                 TransportContext,
974                 ExportContext
975         };
976         
977         char *  conversion_buffer(RunContext context) { return _conversion_buffers[context]; }
978         
979         /* VST support */
980
981         static long vst_callback (AEffect* effect,
982                                   long opcode,
983                                   long index,
984                                   long value,
985                                   void* ptr,
986                                   float opt);
987
988         typedef float (*compute_peak_t)                         (Sample *, jack_nframes_t, float);
989         typedef void  (*apply_gain_to_buffer_t)         (Sample *, jack_nframes_t, float);
990         typedef void  (*mix_buffers_with_gain_t)        (Sample *, Sample *, jack_nframes_t, float);
991         typedef void  (*mix_buffers_no_gain_t)          (Sample *, Sample *, jack_nframes_t);
992
993         static compute_peak_t                   compute_peak;
994         static apply_gain_to_buffer_t   apply_gain_to_buffer;
995         static mix_buffers_with_gain_t  mix_buffers_with_gain;
996         static mix_buffers_no_gain_t    mix_buffers_no_gain;
997
998         static sigc::signal<void> SendFeedback;
999
1000         /* Controllables */
1001
1002         PBD::Controllable* controllable_by_id (const PBD::ID&);
1003
1004   protected:
1005         friend class AudioEngine;
1006         void set_block_size (jack_nframes_t nframes);
1007         void set_frame_rate (jack_nframes_t nframes);
1008
1009   protected:
1010         friend class Diskstream;
1011         void stop_butler ();
1012         void wait_till_butler_finished();
1013
1014   protected:
1015         friend class Route;
1016         void schedule_curve_reallocation ();
1017         void update_latency_compensation (bool, bool);
1018         
1019   private:
1020         int  create (bool& new_session, string* mix_template, jack_nframes_t initial_length);
1021
1022         static const char* _template_suffix;
1023         static const char* _statefile_suffix;
1024         static const char* _pending_suffix;
1025
1026         enum SubState {
1027                 PendingDeclickIn   = 0x1,
1028                 PendingDeclickOut  = 0x2,
1029                 StopPendingCapture = 0x4,
1030                 AutoReturning      = 0x10,
1031                 PendingLocate      = 0x20,
1032                 PendingSetLoop     = 0x40
1033         };
1034
1035         /* stuff used in process() should be close together to
1036            maximise cache hits
1037         */
1038
1039         typedef void (Session::*process_function_type)(jack_nframes_t);
1040
1041         AudioEngine            &_engine;
1042         mutable gint            processing_prohibited;
1043         process_function_type    process_function;
1044         process_function_type    last_process_function;
1045         jack_nframes_t          _current_frame_rate;
1046         int                      transport_sub_state;
1047         mutable gint           _record_status;
1048         jack_nframes_t          _transport_frame;
1049         Location*                end_location;
1050         Location*                start_location;
1051         Slave                  *_slave;
1052         SlaveSource             _slave_type;
1053         volatile float          _transport_speed;
1054         volatile float          _desired_transport_speed;
1055         float                   _last_transport_speed;
1056         jack_nframes_t          _last_slave_transport_frame;
1057         jack_nframes_t           maximum_output_latency;
1058         jack_nframes_t           last_stop_frame;
1059         vector<Sample *>        _passthru_buffers;
1060         vector<Sample *>        _silent_buffers;
1061         vector<Sample *>        _send_buffers;
1062         map<RunContext,char*>   _conversion_buffers;
1063         jack_nframes_t           current_block_size;
1064         jack_nframes_t          _worst_output_latency;
1065         jack_nframes_t          _worst_input_latency;
1066         jack_nframes_t          _worst_track_latency;
1067         bool                    _have_captured;
1068         float                   _meter_hold;
1069         float                   _meter_falloff;
1070         bool                    _end_location_is_free;
1071
1072         void set_worst_io_latencies ();
1073         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1074                 set_worst_io_latencies ();
1075         }
1076
1077         void update_latency_compensation_proxy (void* ignored);
1078
1079         void ensure_passthru_buffers (uint32_t howmany);
1080         
1081         void process_scrub          (jack_nframes_t);
1082         void process_without_events (jack_nframes_t);
1083         void process_with_events    (jack_nframes_t);
1084         void process_audition       (jack_nframes_t);
1085         int  process_export         (jack_nframes_t, ARDOUR::AudioExportSpecification*);
1086         
1087         /* slave tracking */
1088
1089         static const int delta_accumulator_size = 25;
1090         int delta_accumulator_cnt;
1091         long delta_accumulator[delta_accumulator_size];
1092         long average_slave_delta;
1093         int  average_dir;
1094         bool have_first_delta_accumulator;
1095         
1096         enum SlaveState {
1097                 Stopped,
1098                 Waiting,
1099                 Running
1100         };
1101         
1102         SlaveState slave_state;
1103         jack_nframes_t slave_wait_end;
1104
1105         void reset_slave_state ();
1106         bool follow_slave (jack_nframes_t, jack_nframes_t);
1107
1108         bool _exporting;
1109         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1110
1111         void prepare_diskstreams ();
1112         void commit_diskstreams (jack_nframes_t, bool& session_requires_butler);
1113         int  process_routes (jack_nframes_t, jack_nframes_t);
1114         int  silent_process_routes (jack_nframes_t, jack_nframes_t);
1115
1116         bool get_rec_monitors_input () {
1117                 if (actively_recording()) {
1118                         return true;
1119                 } else {
1120                         if (auto_input) {
1121                                 return false;
1122                         } else {
1123                                 return true;
1124                         }
1125                 }
1126         }
1127
1128         int get_transport_declick_required () {
1129
1130                 if (transport_sub_state & PendingDeclickIn) {
1131                         transport_sub_state &= ~PendingDeclickIn;
1132                         return 1;
1133                 } else if (transport_sub_state & PendingDeclickOut) {
1134                         return -1;
1135                 } else {
1136                         return 0;
1137                 }
1138         }
1139
1140         bool maybe_stop (jack_nframes_t limit) {
1141                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1142                         stop_transport ();
1143                         return true;
1144                 }
1145                 return false;
1146         }
1147
1148         void check_declick_out ();
1149
1150         MIDI::MachineControl*    mmc;
1151         MIDI::Port*             _mmc_port;
1152         MIDI::Port*             _mtc_port;
1153         MIDI::Port*             _midi_port;
1154         string                  _path;
1155         string                  _name;
1156         bool                     do_not_record_plugins;
1157
1158         /* toggles */
1159
1160         bool auto_play;
1161         bool punch_in;
1162         bool punch_out;
1163         bool auto_loop;
1164         bool seamless_loop;
1165         bool loop_changing;
1166         jack_nframes_t last_loopend;
1167         bool auto_input;
1168         bool crossfades_active;
1169         bool all_safe;
1170         bool auto_return;
1171         bool monitor_in;
1172         bool send_mtc;
1173         bool send_mmc;
1174         bool mmc_control;
1175         bool midi_control;
1176
1177         RingBuffer<Event*> pending_events;
1178
1179         void hookup_io ();
1180         void when_engine_running ();
1181         sigc::connection first_time_running;
1182         void graph_reordered ();
1183
1184         string _current_snapshot_name;
1185
1186         XMLTree* state_tree;
1187         bool     state_was_pending;
1188         StateOfTheState _state_of_the_state;
1189
1190         void     auto_save();
1191         int      load_options (const XMLNode&);
1192         XMLNode& get_options () const;
1193         int      load_state (string snapshot_name);
1194
1195         jack_nframes_t   _last_roll_location;
1196         jack_nframes_t   _last_record_location;
1197         bool              pending_locate_roll;
1198         jack_nframes_t    pending_locate_frame;
1199
1200         bool              pending_locate_flush;
1201         bool              pending_abort;
1202         bool              pending_auto_loop;
1203         
1204         Sample*           butler_mixdown_buffer;
1205         float*            butler_gain_buffer;
1206         pthread_t         butler_thread;
1207         Glib::Mutex       butler_request_lock;
1208         Glib::Cond        butler_paused;
1209         bool              butler_should_run;
1210         mutable gint      butler_should_do_transport_work;
1211         int               butler_request_pipe[2];
1212         
1213         struct ButlerRequest {
1214             enum Type {
1215                     Wake,
1216                     Run,
1217                     Pause,
1218                     Quit
1219             };
1220         };
1221
1222         enum PostTransportWork {
1223                 PostTransportStop               = 0x1,
1224                 PostTransportDisableRecord      = 0x2,
1225                 PostTransportPosition           = 0x8,
1226                 PostTransportDidRecord          = 0x20,
1227                 PostTransportDuration           = 0x40,
1228                 PostTransportLocate             = 0x80,
1229                 PostTransportRoll               = 0x200,
1230                 PostTransportAbort              = 0x800,
1231                 PostTransportOverWrite          = 0x1000,
1232                 PostTransportSpeed              = 0x2000,
1233                 PostTransportAudition           = 0x4000,
1234                 PostTransportScrub              = 0x8000,
1235                 PostTransportReverse            = 0x10000,
1236                 PostTransportInputChange        = 0x20000,
1237                 PostTransportCurveRealloc       = 0x40000
1238         };
1239         
1240         static const PostTransportWork ProcessCannotProceedMask = 
1241                 PostTransportWork (PostTransportInputChange|
1242                                    PostTransportSpeed|
1243                                    PostTransportReverse|
1244                                    PostTransportCurveRealloc|
1245                                    PostTransportScrub|
1246                                    PostTransportAudition|
1247                                    PostTransportLocate|
1248                                    PostTransportStop);
1249         
1250         PostTransportWork post_transport_work;
1251
1252         void             summon_butler ();
1253         void             schedule_butler_transport_work ();
1254         int              start_butler_thread ();
1255         void             terminate_butler_thread ();
1256         static void    *_butler_thread_work (void *arg);
1257         void*            butler_thread_work ();
1258
1259         uint32_t    cumulative_rf_motion;
1260         uint32_t    rf_scale;
1261
1262         void set_rf_speed (float speed);
1263         void reset_rf_scale (jack_nframes_t frames_moved);
1264
1265         Locations        _locations;
1266         void              locations_changed ();
1267         void              locations_added (Location*);
1268         void              handle_locations_changed (Locations::LocationList&);
1269
1270         sigc::connection auto_punch_start_changed_connection;
1271         sigc::connection auto_punch_end_changed_connection;
1272         sigc::connection auto_punch_changed_connection;
1273         void             auto_punch_start_changed (Location *);
1274         void             auto_punch_end_changed (Location *);
1275         void             auto_punch_changed (Location *);
1276
1277         sigc::connection auto_loop_start_changed_connection;
1278         sigc::connection auto_loop_end_changed_connection;
1279         sigc::connection auto_loop_changed_connection;
1280         void             auto_loop_changed (Location *);
1281
1282         typedef list<Event *> Events;
1283         Events           events;
1284         Events           immediate_events;
1285         Events::iterator next_event;
1286
1287         /* there can only ever be one of each of these */
1288
1289         Event *auto_loop_event;
1290         Event *punch_out_event;
1291         Event *punch_in_event;
1292
1293         /* events */
1294
1295         void dump_events () const;
1296         void queue_event (Event *ev);
1297         void merge_event (Event*);
1298         void replace_event (Event::Type, jack_nframes_t action_frame, jack_nframes_t target = 0);
1299         bool _replace_event (Event*);
1300         bool _remove_event (Event *);
1301         void _clear_event_type (Event::Type);
1302
1303         void first_stage_init (string path, string snapshot_name);
1304         int  second_stage_init (bool new_tracks);
1305         void find_current_end ();
1306         void remove_empty_sounds ();
1307
1308         void setup_midi_control ();
1309         int  midi_read (MIDI::Port *);
1310
1311         void enable_record ();
1312         
1313         void increment_transport_position (uint32_t val) {
1314                 if (max_frames - val < _transport_frame) {
1315                         _transport_frame = max_frames;
1316                 } else {
1317                         _transport_frame += val;
1318                 }
1319         }
1320
1321         void decrement_transport_position (uint32_t val) {
1322                 if (val < _transport_frame) {
1323                         _transport_frame -= val;
1324                 } else {
1325                         _transport_frame = 0;
1326                 }
1327         }
1328
1329         void post_transport_motion ();
1330         static void *session_loader_thread (void *arg);
1331
1332         void *do_work();
1333
1334         void set_next_event ();
1335         void process_event (Event *);
1336
1337         /* MIDI Machine Control */
1338
1339         void deliver_mmc (MIDI::MachineControl::Command, jack_nframes_t);
1340         void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1341         void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1342
1343         void spp_start (MIDI::Parser&);
1344         void spp_continue (MIDI::Parser&);
1345         void spp_stop (MIDI::Parser&);
1346
1347         void mmc_deferred_play (MIDI::MachineControl &);
1348         void mmc_stop (MIDI::MachineControl &);
1349         void mmc_step (MIDI::MachineControl &, int);
1350         void mmc_pause (MIDI::MachineControl &);
1351         void mmc_record_pause (MIDI::MachineControl &);
1352         void mmc_record_strobe (MIDI::MachineControl &);
1353         void mmc_record_exit (MIDI::MachineControl &);
1354         void mmc_track_record_status (MIDI::MachineControl &, 
1355                                       uint32_t track, bool enabled);
1356         void mmc_fast_forward (MIDI::MachineControl &);
1357         void mmc_rewind (MIDI::MachineControl &);
1358         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1359         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1360         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1361
1362         struct timeval last_mmc_step;
1363         double step_speed;
1364
1365         typedef sigc::slot<bool> MidiTimeoutCallback;
1366         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1367
1368         MidiTimeoutList midi_timeouts;
1369         bool mmc_step_timeout ();
1370
1371         MIDI::byte mmc_buffer[32];
1372         MIDI::byte mtc_msg[16];
1373         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1374         MIDI::byte midi_msg[16];
1375         jack_nframes_t  outbound_mtc_smpte_frame;
1376         SMPTE::Time transmitting_smpte_time;
1377         int next_quarter_frame_to_send;
1378         
1379         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1380         jack_nframes_t _frames_per_hour;
1381         jack_nframes_t _smpte_frames_per_hour;
1382         jack_nframes_t _smpte_offset;
1383         bool _smpte_offset_negative;
1384         
1385         /* cache the most-recently requested time conversions.
1386            this helps when we have multiple clocks showing the
1387            same time (e.g. the transport frame)
1388         */
1389
1390         bool       last_smpte_valid;
1391         jack_nframes_t  last_smpte_when;
1392         SMPTE::Time last_smpte;
1393
1394         int send_full_time_code ();
1395         int send_midi_time_code ();
1396
1397         void send_full_time_code_in_another_thread ();
1398         void send_midi_time_code_in_another_thread ();
1399         void send_time_code_in_another_thread (bool full);
1400         void send_mmc_in_another_thread (MIDI::MachineControl::Command, jack_nframes_t frame = 0);
1401
1402         jack_nframes_t adjust_apparent_position (jack_nframes_t frames);
1403         
1404         void reset_record_status ();
1405         
1406         int no_roll (jack_nframes_t nframes, jack_nframes_t offset);
1407         
1408         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1409         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1410
1411         struct MIDIRequest {
1412             
1413             enum Type {
1414                     SendFullMTC,
1415                     SendMTC,
1416                     SendMMC,
1417                     PortChange,
1418                     SendMessage,
1419                     Deliver,
1420                     Quit
1421             };
1422             
1423             Type type;
1424             MIDI::MachineControl::Command mmc_cmd;
1425             jack_nframes_t locate_frame;
1426
1427             // for SendMessage type
1428
1429             MIDI::Port * port;
1430             MIDI::channel_t chan;
1431             union {
1432                 MIDI::EventTwoBytes data;
1433                 MIDI::byte* buf;
1434             };
1435
1436             union { 
1437                 MIDI::eventType ev;
1438                 int32_t size;
1439             };
1440
1441             MIDIRequest () {}
1442             
1443             void *operator new(size_t ignored) {
1444                     return pool.alloc ();
1445             };
1446
1447             void operator delete(void *ptr, size_t size) {
1448                     pool.release (ptr);
1449             }
1450
1451           private:
1452             static MultiAllocSingleReleasePool pool;
1453         };
1454
1455         Glib::Mutex       midi_lock;
1456         pthread_t       midi_thread;
1457         int             midi_request_pipe[2];
1458         mutable  gint   butler_active;
1459         RingBuffer<MIDIRequest*> midi_requests;
1460
1461         int           start_midi_thread ();
1462         void          terminate_midi_thread ();
1463         void          poke_midi_thread ();
1464         static void *_midi_thread_work (void *arg);
1465         void          midi_thread_work ();
1466         void          change_midi_ports ();
1467         int           use_config_midi_ports ();
1468
1469         bool waiting_to_start;
1470
1471         void set_auto_loop (bool yn);
1472         void overwrite_some_buffers (Diskstream*);
1473         void flush_all_redirects ();
1474         void locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1475         void start_locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1476         void force_locate (jack_nframes_t frame, bool with_roll = false);
1477         void set_diskstream_speed (Diskstream*, float speed);
1478         void set_transport_speed (float speed, bool abort = false);
1479         void stop_transport (bool abort = false);
1480         void start_transport ();
1481         void actually_start_transport ();
1482         void realtime_stop (bool abort);
1483         void non_realtime_start_scrub ();
1484         void non_realtime_set_speed ();
1485         void non_realtime_stop (bool abort);
1486         void non_realtime_overwrite ();
1487         void non_realtime_buffer_fill ();
1488         void butler_transport_work ();
1489         void post_transport ();
1490         void engine_halted ();
1491         void xrun_recovery ();
1492
1493         TempoMap    *_tempo_map;
1494         void          tempo_map_changed (Change);
1495
1496         /* edit/mix groups */
1497
1498         int load_route_groups (const XMLNode&, bool is_edit);
1499         int load_edit_groups (const XMLNode&);
1500         int load_mix_groups (const XMLNode&);
1501
1502
1503         list<RouteGroup *> edit_groups;
1504         list<RouteGroup *> mix_groups;
1505
1506         /* disk-streams */
1507
1508         DiskstreamList  diskstreams; 
1509         mutable Glib::RWLock diskstream_lock;
1510         uint32_t dstream_buffer_size;
1511         void add_diskstream (Diskstream*);
1512         int  load_diskstreams (const XMLNode&);
1513
1514         /* routes stuff */
1515
1516         SerializedRCUManager<RouteList>  routes;
1517
1518         void   add_route (boost::shared_ptr<Route>);
1519         uint32_t destructive_index;
1520
1521         int load_routes (const XMLNode&);
1522         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1523
1524         /* mixer stuff */
1525
1526         bool      _solo_latched;
1527         SoloModel _solo_model;
1528         bool       solo_update_disabled;
1529         bool       currently_soloing;
1530         
1531         void route_mute_changed (void *src);
1532         void route_solo_changed (void *src, boost::shared_ptr<Route>);
1533         void catch_up_on_solo ();
1534         void update_route_solo_state ();
1535         void modify_solo_mute (bool, bool);
1536         void strip_portname_for_solo (string& portname);
1537
1538         /* REGION MANAGEMENT */
1539
1540         mutable Glib::Mutex region_lock;
1541         typedef map<PBD::ID,AudioRegion *> AudioRegionList;
1542         AudioRegionList audio_regions;
1543         
1544         void region_renamed (Region *);
1545         void region_changed (Change, Region *);
1546         void add_region (Region *);
1547         void remove_region (Region *);
1548
1549         int load_regions (const XMLNode& node);
1550
1551         /* SOURCES */
1552         
1553         mutable Glib::Mutex audio_source_lock;
1554         typedef std::map<PBD::ID,AudioSource *> AudioSourceList;
1555
1556         AudioSourceList audio_sources;
1557
1558         int load_sources (const XMLNode& node);
1559         XMLNode& get_sources_as_xml ();
1560
1561         Source *XMLSourceFactory (const XMLNode&);
1562
1563         /* PLAYLISTS */
1564         
1565         mutable Glib::Mutex playlist_lock;
1566         typedef set<Playlist *> PlaylistList;
1567         PlaylistList playlists;
1568         PlaylistList unused_playlists;
1569
1570         int load_playlists (const XMLNode&);
1571         int load_unused_playlists (const XMLNode&);
1572         void remove_playlist (Playlist *);
1573         void track_playlist (Playlist *, bool);
1574
1575         Playlist *playlist_factory (string name);
1576         Playlist *XMLPlaylistFactory (const XMLNode&);
1577
1578         void playlist_length_changed (Playlist *);
1579         void diskstream_playlist_changed (Diskstream *);
1580
1581         /* NAMED SELECTIONS */
1582
1583         mutable Glib::Mutex named_selection_lock;
1584         typedef set<NamedSelection *> NamedSelectionList;
1585         NamedSelectionList named_selections;
1586
1587         int load_named_selections (const XMLNode&);
1588
1589         NamedSelection *named_selection_factory (string name);
1590         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1591
1592         /* DEFAULT FADE CURVES */
1593
1594         float default_fade_steepness;
1595         float default_fade_msecs;
1596
1597         /* AUDITIONING */
1598
1599         boost::shared_ptr<Auditioner> auditioner;
1600         void set_audition (AudioRegion*);
1601         void non_realtime_set_audition ();
1602         AudioRegion *pending_audition_region;
1603
1604         /* EXPORT */
1605
1606         /* FLATTEN */
1607
1608         int flatten_one_track (AudioTrack&, jack_nframes_t start, jack_nframes_t cnt);
1609
1610         /* INSERT AND SEND MANAGEMENT */
1611         
1612         list<PortInsert *>   _port_inserts;
1613         list<PluginInsert *> _plugin_inserts;
1614         list<Send *>         _sends;
1615         uint32_t          send_cnt;
1616         uint32_t          insert_cnt;
1617
1618         void add_redirect (Redirect *);
1619         void remove_redirect (Redirect *);
1620
1621         /* S/W RAID */
1622
1623         struct space_and_path {
1624             uint32_t blocks; /* 4kB blocks */
1625             string path;
1626             
1627             space_and_path() { 
1628                     blocks = 0;
1629             }
1630         };
1631
1632         struct space_and_path_ascending_cmp {
1633             bool operator() (space_and_path a, space_and_path b) {
1634                     return a.blocks > b.blocks;
1635             }
1636         };
1637         
1638         void setup_raid_path (string path);
1639
1640         vector<space_and_path> session_dirs;
1641         vector<space_and_path>::iterator last_rr_session_dir;
1642         uint32_t _total_free_4k_blocks;
1643         Glib::Mutex space_lock;
1644
1645         static const char* sound_dir_name;
1646         static const char* tape_dir_name;
1647         static const char* dead_sound_dir_name;
1648         static const char* peak_dir_name;
1649
1650         string discover_best_sound_dir (bool destructive = false);
1651         int ensure_sound_dir (string, string&);
1652         void refresh_disk_space ();
1653
1654         mutable gint _playback_load;
1655         mutable gint _capture_load;
1656         mutable gint _playback_load_min;
1657         mutable gint _capture_load_min;
1658
1659         /* I/O Connections */
1660
1661         typedef list<Connection *> ConnectionList;
1662         mutable Glib::Mutex connection_lock;
1663         ConnectionList _connections;
1664         int load_connections (const XMLNode&);
1665
1666         int set_slave_source (SlaveSource, jack_nframes_t);
1667
1668         void reverse_diskstream_buffers ();
1669
1670         UndoHistory history;
1671         UndoTransaction current_trans;
1672
1673         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1674         GlobalRouteMeterState get_global_route_metering ();
1675
1676         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1677         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1678
1679         void set_global_mute (GlobalRouteBooleanState s, void *src);
1680         void set_global_solo (GlobalRouteBooleanState s, void *src);
1681         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1682
1683         void jack_timebase_callback (jack_transport_state_t, jack_nframes_t, jack_position_t*, int);
1684         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1685         void record_enable_change_all (bool yn);
1686
1687         XMLNode& state(bool);
1688
1689         /* click track */
1690
1691         struct Click {
1692             jack_nframes_t start;
1693             jack_nframes_t duration;
1694             jack_nframes_t offset;
1695             const Sample *data;
1696
1697             Click (jack_nframes_t s, jack_nframes_t d, const Sample *b) 
1698                     : start (s), duration (d), data (b) { offset = 0; }
1699             
1700             void *operator new(size_t ignored) {
1701                     return pool.alloc ();
1702             };
1703
1704             void operator delete(void *ptr, size_t size) {
1705                     pool.release (ptr);
1706             }
1707
1708           private:
1709             static Pool pool;
1710         };
1711  
1712         typedef list<Click*> Clicks;
1713
1714         Clicks          clicks;
1715         bool           _clicking;
1716         boost::shared_ptr<IO> _click_io;
1717         Sample*         click_data;
1718         Sample*         click_emphasis_data;
1719         jack_nframes_t  click_length;
1720         jack_nframes_t  click_emphasis_length;
1721         mutable Glib::RWLock click_lock;
1722
1723         static const Sample         default_click[];
1724         static const jack_nframes_t default_click_length;
1725         static const Sample         default_click_emphasis[];
1726         static const jack_nframes_t default_click_emphasis_length;
1727
1728         Click *get_click();
1729         void   setup_click_sounds (int which);
1730         void   clear_clicks ();
1731         void   click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t offset);
1732
1733         vector<Route*> master_outs;
1734         
1735         EditMode _edit_mode;
1736         EditMode pending_edit_mode;
1737
1738         /* range playback */
1739
1740         list<AudioRange> current_audio_range;
1741         bool _play_range;
1742         void set_play_range (bool yn);
1743         void setup_auto_play ();
1744
1745         /* main outs */
1746         uint32_t main_outs;
1747         
1748         boost::shared_ptr<IO> _master_out;
1749         boost::shared_ptr<IO> _control_out;
1750
1751         AutoConnectOption input_auto_connect;
1752         AutoConnectOption output_auto_connect;
1753
1754         gain_t* _gain_automation_buffer;
1755         pan_t** _pan_automation_buffer;
1756         void allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force);
1757         uint32_t _npan_buffers;
1758
1759         /* VST support */
1760
1761         long _vst_callback (VSTPlugin*,
1762                             long opcode,
1763                             long index,
1764                             long value,
1765                             void* ptr,
1766                             float opt);
1767
1768         /* number of hardware audio ports we're using,
1769            based on max (requested,available)
1770         */
1771
1772         uint32_t n_physical_outputs;
1773         uint32_t n_physical_inputs;
1774
1775         void remove_pending_capture_state ();
1776
1777         int find_all_sources (std::string path, std::set<std::string>& result);
1778         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1779
1780         LayerModel layer_model;
1781         CrossfadeModel xfade_model;
1782
1783         typedef std::list<PBD::Controllable*> Controllables;
1784         Glib::Mutex controllables_lock;
1785         Controllables controllables;
1786
1787         void add_controllable (PBD::Controllable*);
1788         void remove_controllable (PBD::Controllable*);
1789 };
1790
1791 } // namespace ARDOUR
1792
1793 #endif /* __ardour_session_h__ */