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