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