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