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