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