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