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