8709fff148575adf12aec3066f492ab88a54c50f
[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         XMLNode& get_state();
430         int      set_state(const XMLNode& node); // not idempotent
431         XMLNode& get_template();
432
433         /// The instant xml file is written to the session directory
434         void add_instant_xml (XMLNode&);
435         XMLNode * instant_xml (const std::string& str);
436
437         enum StateOfTheState {
438                 Clean = 0x0,
439                 Dirty = 0x1,
440                 CannotSave = 0x2,
441                 Deletion = 0x4,
442                 InitialConnecting = 0x8,
443                 Loading = 0x10,
444                 InCleanup = 0x20
445         };
446
447         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
448
449         RouteGroup* add_edit_group (string);
450         RouteGroup* add_mix_group (string);
451
452         void remove_edit_group (RouteGroup&);
453         void remove_mix_group (RouteGroup&);
454
455         RouteGroup *mix_group_by_name (string);
456         RouteGroup *edit_group_by_name (string);
457
458         sigc::signal<void,RouteGroup*> edit_group_added;
459         sigc::signal<void,RouteGroup*> mix_group_added;
460         sigc::signal<void> edit_group_removed;
461         sigc::signal<void> mix_group_removed;
462
463         void foreach_edit_group (sigc::slot<void,RouteGroup*> sl) {
464                 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) {
465                         sl (*i);
466                 }
467         }
468
469         void foreach_mix_group (sigc::slot<void,RouteGroup*> sl) {
470                 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); i++) {
471                         sl (*i);
472                 }
473         }
474
475         /* fundamental operations. duh. */
476
477         std::list<boost::shared_ptr<AudioTrack> > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
478         RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many);
479         
480         std::list<boost::shared_ptr<MidiTrack> > new_midi_track (TrackMode mode = Normal, uint32_t how_many = 1);
481         //boost::shared_ptr<Route>     new_midi_route (uint32_t how_many = 1);
482
483         void   remove_route (boost::shared_ptr<Route>);
484         void   resort_routes ();
485         void   resort_routes_using (boost::shared_ptr<RouteList>);
486         
487         void   set_remote_control_ids();
488
489         AudioEngine &engine() { return _engine; };
490
491         int32_t  max_level;
492         int32_t  min_level;
493
494         /* Time */
495
496         nframes_t transport_frame () const {return _transport_frame; }
497         nframes_t audible_frame () const;
498
499         enum PullupFormat {
500                 pullup_Plus4Plus1,
501                 pullup_Plus4,
502                 pullup_Plus4Minus1,
503                 pullup_Plus1,
504                 pullup_None,
505                 pullup_Minus1,
506                 pullup_Minus4Plus1,
507                 pullup_Minus4,
508                 pullup_Minus4Minus1
509         };
510
511         int  set_smpte_format (SmpteFormat);
512         void sync_time_vars();
513
514         void bbt_time (nframes_t when, BBT_Time&);
515         void smpte_to_sample( SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes ) const;
516         void sample_to_smpte( nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
517         void smpte_time (SMPTE::Time &);
518         void smpte_time (nframes_t when, SMPTE::Time&);
519         void smpte_time_subframes (nframes_t when, SMPTE::Time&);
520
521         void smpte_duration (nframes_t, SMPTE::Time&) const;
522         void smpte_duration_string (char *, nframes_t) const;
523
524         void           set_smpte_offset (nframes_t);
525         nframes_t smpte_offset () const { return _smpte_offset; }
526         void           set_smpte_offset_negative (bool);
527         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
528
529         nframes_t convert_to_frames_at (nframes_t position, AnyTime&);
530
531         static sigc::signal<void> StartTimeChanged;
532         static sigc::signal<void> EndTimeChanged;
533         static sigc::signal<void> SMPTEOffsetChanged;
534
535         void        request_slave_source (SlaveSource);
536         bool        synced_to_jack() const { return Config->get_slave_source() == JACK; }
537
538         float       transport_speed() const { return _transport_speed; }
539         bool        transport_stopped() const { return _transport_speed == 0.0f; }
540         bool        transport_rolling() const { return _transport_speed != 0.0f; }
541
542         int jack_slave_sync (nframes_t);
543
544         TempoMap& tempo_map() { return *_tempo_map; }
545         
546         /* region info  */
547
548         sigc::signal<void,boost::shared_ptr<Region> > RegionAdded;
549         sigc::signal<void,boost::shared_ptr<Region> > RegionRemoved;
550
551         int region_name (string& result, string base = string(""), bool newlevel = false) const;
552         string new_region_name (string);
553         string path_from_region_name (DataType type, string name, string identifier);
554
555         boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>);
556         
557         void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
558
559         boost::shared_ptr<Region>      XMLRegionFactory (const XMLNode&, bool full);
560         boost::shared_ptr<AudioRegion> XMLAudioRegionFactory (const XMLNode&, bool full);
561         boost::shared_ptr<MidiRegion>  XMLMidiRegionFactory (const XMLNode&, bool full);
562
563         template<class T> void foreach_region (T *obj, void (T::*func)(boost::shared_ptr<Region>));
564
565         /* source management */
566
567         struct import_status : public InterThreadInfo {
568             string doing_what;
569             
570             /* control info */
571             bool multichan;
572             bool sample_convert;
573             volatile bool freeze;
574             std::vector<Glib::ustring> paths;
575             
576             /* result */
577             std::vector<boost::shared_ptr<Region> > new_regions;
578         };
579
580         int import_audiofile (import_status&);
581         bool sample_rate_convert (import_status&, string infile, string& outfile);
582         string build_tmp_convert_name (string file);
583
584         SlaveSource post_export_slave;
585         nframes_t post_export_position;
586
587         int start_audio_export (ARDOUR::AudioExportSpecification&);
588         int stop_audio_export (ARDOUR::AudioExportSpecification&);
589         void finalize_audio_export ();
590
591         void add_source (boost::shared_ptr<Source>);
592         void remove_source (boost::weak_ptr<Source>);
593
594         struct cleanup_report {
595                 vector<string> paths;
596                 int64_t        space;
597         };
598
599         int  cleanup_sources (cleanup_report&);
600         int  cleanup_trash_sources (cleanup_report&);
601
602         int destroy_region (boost::shared_ptr<Region>);
603         int destroy_regions (std::list<boost::shared_ptr<Region> >);
604
605         int remove_last_capture ();
606
607         /* handlers should return -1 for "stop cleanup", 0 for
608            "yes, delete this playlist" and 1 for "no, don't delete
609            this playlist.
610         */
611         
612         sigc::signal<int,boost::shared_ptr<ARDOUR::Playlist> > AskAboutPlaylistDeletion;
613
614         /* handlers should return !0 for use pending state, 0 for
615            ignore it.
616         */
617
618         static sigc::signal<int> AskAboutPendingState;
619         
620         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
621
622         boost::shared_ptr<MidiSource> create_midi_source_for_session (ARDOUR::MidiDiskstream&);
623
624         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
625         boost::shared_ptr<Source> source_by_path_and_channel (const Glib::ustring&, uint16_t);
626
627         /* playlist management */
628
629         boost::shared_ptr<Playlist> playlist_by_name (string name);
630         void add_playlist (boost::shared_ptr<Playlist>);
631         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistAdded;
632         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistRemoved;
633
634         uint32_t n_playlists() const;
635
636         template<class T> void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
637         void get_playlists (std::vector<boost::shared_ptr<Playlist> >&);
638
639         /* named selections */
640
641         NamedSelection* named_selection_by_name (string name);
642         void add_named_selection (NamedSelection *);
643         void remove_named_selection (NamedSelection *);
644
645         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
646         sigc::signal<void> NamedSelectionAdded;
647         sigc::signal<void> NamedSelectionRemoved;
648
649         /* Curves and AutomationLists (TODO when they go away) */
650         void add_curve(Curve*);
651         void add_automation_list(AutomationList*);
652         
653         nframes_t automation_interval () const { return _automation_interval; }
654
655         /* fade curves */
656
657         float get_default_fade_length () const { return default_fade_msecs; }
658         float get_default_fade_steepness () const { return default_fade_steepness; }
659         void set_default_fade (float steepness, float msecs);
660
661         /* auditioning */
662
663         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
664         void audition_playlist ();
665         void audition_region (boost::shared_ptr<Region>);
666         void cancel_audition ();
667         bool is_auditioning () const;
668         
669         sigc::signal<void,bool> AuditionActive;
670
671         /* flattening stuff */
672
673         int write_one_audio_track (AudioTrack&, nframes_t start, nframes_t cnt, bool overwrite,
674                         vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot);
675
676         int freeze (InterThreadInfo&);
677
678         /* session-wide solo/mute/rec-enable */
679         
680         bool soloing() const { return currently_soloing; }
681
682         void set_all_solo (bool);
683         void set_all_mute (bool);
684
685         sigc::signal<void,bool> SoloActive;
686         sigc::signal<void> SoloChanged;
687         
688         void record_disenable_all ();
689         void record_enable_all ();
690
691         /* control/master out */
692
693         boost::shared_ptr<IO> control_out() const { return _control_out; }
694         boost::shared_ptr<IO> master_out() const { return _master_out; }
695
696         /* insert/send management */
697         
698         uint32_t n_port_inserts() const { return _port_inserts.size(); }
699         uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); }
700         uint32_t n_sends() const { return _sends.size(); }
701
702         uint32_t next_send_id();
703         uint32_t next_insert_id();
704         void mark_send_id (uint32_t);
705         void mark_insert_id (uint32_t);
706
707         /* s/w "RAID" management */
708         
709         nframes_t available_capture_duration();
710
711         /* I/O bundles */
712
713         template<class T> void foreach_bundle (T *obj, void (T::*func)(Bundle *));
714         void add_bundle (Bundle *);
715         void remove_bundle (Bundle *);
716         Bundle *bundle_by_name (string) const;
717
718         sigc::signal<void,Bundle *> BundleAdded;
719         sigc::signal<void,Bundle *> BundleRemoved;
720
721         /* MIDI */
722
723         int set_mtc_port (string port_tag);
724         int set_mmc_port (string port_tag);
725         int set_midi_port (string port_tag);
726         MIDI::Port *mtc_port() const { return _mtc_port; }
727         MIDI::Port *mmc_port() const { return _mmc_port; }
728         MIDI::Port *midi_port() const { return _midi_port; }
729
730         sigc::signal<void> MTC_PortChanged;
731         sigc::signal<void> MMC_PortChanged;
732         sigc::signal<void> MIDI_PortChanged;
733
734         void set_trace_midi_input (bool, MIDI::Port* port = 0);
735         void set_trace_midi_output (bool, MIDI::Port* port = 0);
736
737         bool get_trace_midi_input(MIDI::Port *port = 0);
738         bool get_trace_midi_output(MIDI::Port *port = 0);
739         
740         void send_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
741
742         void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size);
743
744         void set_mmc_receive_device_id (uint32_t id);
745         void set_mmc_send_device_id (uint32_t id);
746         
747         /* Scrubbing */
748
749         void start_scrub (nframes_t where);
750         void stop_scrub ();
751         void set_scrub_speed (float);
752         nframes_t scrub_buffer_size() const;
753         sigc::signal<void> ScrubReady;
754
755         /* History (for editors, mixers, UIs etc.) */
756
757         /** Undo some transactions.
758          * @param n Number of transactions to undo.
759          */
760         void undo (uint32_t n) {
761                 _history.undo (n);
762         }
763
764         void redo (uint32_t n) {
765                 _history.redo (n);
766         }
767
768         UndoHistory& history() { return _history; }
769         
770         uint32_t undo_depth() const { return _history.undo_depth(); }
771         uint32_t redo_depth() const { return _history.redo_depth(); }
772         string next_undo() const { return _history.next_undo(); }
773         string next_redo() const { return _history.next_redo(); }
774
775         void begin_reversible_command (const string& cmd_name);
776         void commit_reversible_command (Command* cmd = 0);
777
778         void add_command (Command *const cmd) {
779                 current_trans->add_command (cmd);
780         }
781
782         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
783
784         // these commands are implemented in libs/ardour/session_command.cc
785         Command* memento_command_factory(XMLNode* n);
786         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
787
788         Command* global_state_command_factory (const XMLNode& n);
789
790         class GlobalRouteStateCommand : public Command
791         {
792           public:
793                 GlobalRouteStateCommand (Session&, void*);
794                 GlobalRouteStateCommand (Session&, const XMLNode& node);
795                 int set_state (const XMLNode&);
796                 XMLNode& get_state ();
797
798           protected:
799                 GlobalRouteBooleanState before, after;
800                 Session& sess;
801                 void* src;
802                 
803         };
804
805         class GlobalSoloStateCommand : public GlobalRouteStateCommand
806         {
807           public:
808                 GlobalSoloStateCommand (Session &, void *src);
809                 GlobalSoloStateCommand (Session&, const XMLNode&);
810                 void operator()(); //redo
811                 void undo();
812                 XMLNode &get_state();
813                 void mark();
814         };
815
816         class GlobalMuteStateCommand : public GlobalRouteStateCommand
817         {
818           public:
819                 GlobalMuteStateCommand(Session &, void *src);
820                 GlobalMuteStateCommand (Session&, const XMLNode&);
821                 void operator()(); // redo
822                 void undo();
823                 XMLNode &get_state();
824                 void mark();
825         };
826
827         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
828         {
829           public:
830                 GlobalRecordEnableStateCommand(Session &, void *src);
831                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
832                 void operator()(); // redo
833                 void undo();
834                 XMLNode &get_state();
835                 void mark();
836         };
837
838         class GlobalMeteringStateCommand : public Command
839         {
840           public:
841                 GlobalMeteringStateCommand(Session &, void *src);
842                 GlobalMeteringStateCommand (Session&, const XMLNode&);
843                 void operator()();
844                 void undo();
845                 XMLNode &get_state();
846                 int set_state (const XMLNode&);
847                 void mark();
848
849           protected:
850                 Session& sess;
851                 void* src;
852                 GlobalRouteMeterState before;
853                 GlobalRouteMeterState after;
854         };
855
856         /* clicking */
857
858         boost::shared_ptr<IO>  click_io() { return _click_io; }
859                 
860         /* tempo FX */
861
862         struct TimeStretchRequest {
863                 boost::shared_ptr<ARDOUR::AudioRegion> region;
864                 float fraction; /* session: read ; GUI: write */
865                 float progress; /* session: write ; GUI: read */
866                 bool  running;  /* read/write */
867                 bool  quick_seek; /* GUI: write */
868                 bool  antialias;  /* GUI: write */
869
870                 TimeStretchRequest () {} 
871         };
872
873         boost::shared_ptr<AudioRegion> tempoize_region (TimeStretchRequest&);
874
875         /* disk, buffer loads */
876
877         uint32_t playback_load ();
878         uint32_t capture_load ();
879         uint32_t playback_load_min ();
880         uint32_t capture_load_min ();
881
882         void reset_playback_load_min ();
883         void reset_capture_load_min ();
884         
885         float read_data_rate () const;
886         float write_data_rate () const;
887
888         /* ranges */
889
890         void set_audio_range (list<AudioRange>&);
891         void set_music_range (list<MusicRange>&);
892
893         void request_play_range (bool yn);
894         bool get_play_range () const { return _play_range; }
895
896         /* buffers for gain and pan */
897
898         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
899         pan_t** pan_automation_buffer () const  { return _pan_automation_buffer; }
900
901         /* buffers for conversion */
902         enum RunContext {
903                 ButlerContext = 0,
904                 TransportContext,
905                 ExportContext
906         };
907         
908         /* VST support */
909
910         static long vst_callback (AEffect* effect,
911                                   long opcode,
912                                   long index,
913                                   long value,
914                                   void* ptr,
915                                   float opt);
916
917         static sigc::signal<void> SendFeedback;
918
919         /* Controllables */
920
921         boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
922
923         void add_controllable (boost::shared_ptr<PBD::Controllable>);
924         void remove_controllable (PBD::Controllable*);
925
926   protected:
927         friend class AudioEngine;
928         void set_block_size (nframes_t nframes);
929         void set_frame_rate (nframes_t nframes);
930
931   protected:
932         friend class Diskstream;
933         void stop_butler ();
934         void wait_till_butler_finished();
935
936   protected:
937         friend class Route;
938         void schedule_curve_reallocation ();
939         void update_latency_compensation (bool, bool);
940         
941   private:
942         void destroy ();
943
944         void initialize_start_and_end_locations(nframes_t start, nframes_t end);
945         bool create_session_file();
946         bool create_session_file_from_template (const string& template_path);
947
948         nframes_t compute_initial_length ();
949
950         enum SubState {
951                 PendingDeclickIn   = 0x1,
952                 PendingDeclickOut  = 0x2,
953                 StopPendingCapture = 0x4,
954                 AutoReturning      = 0x10,
955                 PendingLocate      = 0x20,
956                 PendingSetLoop     = 0x40
957         };
958
959         /* stuff used in process() should be close together to
960            maximise cache hits
961         */
962
963         typedef void (Session::*process_function_type)(nframes_t);
964
965         AudioEngine            &_engine;
966         mutable gint            processing_prohibited;
967         /// the function called when the main JACK process callback happens
968         process_function_type    process_function;
969         process_function_type    last_process_function;
970         bool                     waiting_for_sync_offset;
971         nframes_t          _base_frame_rate;
972         nframes_t          _current_frame_rate;  //this includes video pullup offset
973         int                      transport_sub_state;
974         mutable gint           _record_status;
975         nframes_t          _transport_frame;
976         Location*                end_location;
977         Location*                start_location;
978         Slave                  *_slave;
979         volatile float          _transport_speed;
980         volatile float          _desired_transport_speed;
981         float                   _last_transport_speed;
982         bool                     auto_play_legal;
983         nframes_t          _last_slave_transport_frame;
984         nframes_t           maximum_output_latency;
985         nframes_t           last_stop_frame;
986         BufferSet*              _scratch_buffers;
987         BufferSet*              _silent_buffers;
988         BufferSet*              _mix_buffers;
989         nframes_t           current_block_size;
990         nframes_t          _worst_output_latency;
991         nframes_t          _worst_input_latency;
992         nframes_t          _worst_track_latency;
993         bool                    _have_captured;
994         float                   _meter_hold;
995         float                   _meter_falloff;
996         bool                    _end_location_is_free;
997
998         void set_worst_io_latencies ();
999         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1000                 set_worst_io_latencies ();
1001         }
1002
1003         void update_latency_compensation_proxy (void* ignored);
1004
1005         void ensure_buffers (ChanCount howmany);
1006         
1007         void process_scrub          (nframes_t);
1008         void process_without_events (nframes_t);
1009         void process_with_events    (nframes_t);
1010         void process_audition       (nframes_t);
1011         int  process_export         (nframes_t, ARDOUR::AudioExportSpecification*);
1012         
1013         /* slave tracking */
1014
1015         static const int delta_accumulator_size = 25;
1016         int delta_accumulator_cnt;
1017         long delta_accumulator[delta_accumulator_size];
1018         long average_slave_delta;
1019         int  average_dir;
1020         bool have_first_delta_accumulator;
1021         
1022         enum SlaveState {
1023                 Stopped,
1024                 Waiting,
1025                 Running
1026         };
1027         
1028         SlaveState slave_state;
1029         nframes_t slave_wait_end;
1030
1031         void reset_slave_state ();
1032         bool follow_slave (nframes_t, nframes_t);
1033         void set_slave_source (SlaveSource);
1034
1035         bool _exporting;
1036         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1037
1038         void prepare_diskstreams ();
1039         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1040         int  process_routes (nframes_t, nframes_t);
1041         int  silent_process_routes (nframes_t, nframes_t);
1042
1043         bool get_rec_monitors_input () {
1044                 if (actively_recording()) {
1045                         return true;
1046                 } else {
1047                         if (Config->get_auto_input()) {
1048                                 return false;
1049                         } else {
1050                                 return true;
1051                         }
1052                 }
1053         }
1054
1055         int get_transport_declick_required () {
1056
1057                 if (transport_sub_state & PendingDeclickIn) {
1058                         transport_sub_state &= ~PendingDeclickIn;
1059                         return 1;
1060                 } else if (transport_sub_state & PendingDeclickOut) {
1061                         return -1;
1062                 } else {
1063                         return 0;
1064                 }
1065         }
1066
1067         bool maybe_stop (nframes_t limit) {
1068                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1069                         stop_transport ();
1070                         return true;
1071                 }
1072                 return false;
1073         }
1074
1075         bool maybe_sync_start (nframes_t&, nframes_t&);
1076
1077         void check_declick_out ();
1078
1079         MIDI::MachineControl*    mmc;
1080         MIDI::Port*             _mmc_port;
1081         MIDI::Port*             _mtc_port;
1082         MIDI::Port*             _midi_port;
1083         string                  _path;
1084         string                  _name;
1085         bool                     session_send_mmc;
1086         bool                     session_send_mtc;
1087         bool                     session_midi_feedback;
1088         bool                     play_loop;
1089         bool                     loop_changing;
1090         nframes_t                last_loopend;
1091
1092         boost::scoped_ptr<SessionDirectory> _session_dir;
1093
1094         RingBuffer<Event*> pending_events;
1095
1096         void hookup_io ();
1097         void when_engine_running ();
1098         void graph_reordered ();
1099
1100         string _current_snapshot_name;
1101
1102         XMLTree* state_tree;
1103         bool     state_was_pending;
1104         StateOfTheState _state_of_the_state;
1105
1106         void     auto_save();
1107         int      load_options (const XMLNode&);
1108         XMLNode& get_options () const;
1109         int      load_state (string snapshot_name);
1110         bool     save_config_options_predicate (ConfigVariableBase::Owner owner) const;
1111
1112         nframes_t _last_roll_location;
1113         nframes_t _last_record_location;
1114
1115         bool              pending_locate_roll;
1116         nframes_t         pending_locate_frame;
1117         bool              pending_locate_flush;
1118         bool              pending_abort;
1119         bool              pending_auto_loop;
1120         
1121         Sample*           butler_mixdown_buffer;
1122         float*            butler_gain_buffer;
1123         pthread_t         butler_thread;
1124         Glib::Mutex       butler_request_lock;
1125         Glib::Cond        butler_paused;
1126         bool              butler_should_run;
1127         mutable gint      butler_should_do_transport_work;
1128         int               butler_request_pipe[2];
1129
1130         inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); }
1131         
1132         struct ButlerRequest {
1133             enum Type {
1134                     Wake,
1135                     Run,
1136                     Pause,
1137                     Quit
1138             };
1139         };
1140
1141         enum PostTransportWork {
1142                 PostTransportStop               = 0x1,
1143                 PostTransportDisableRecord      = 0x2,
1144                 PostTransportPosition           = 0x8,
1145                 PostTransportDidRecord          = 0x20,
1146                 PostTransportDuration           = 0x40,
1147                 PostTransportLocate             = 0x80,
1148                 PostTransportRoll               = 0x200,
1149                 PostTransportAbort              = 0x800,
1150                 PostTransportOverWrite          = 0x1000,
1151                 PostTransportSpeed              = 0x2000,
1152                 PostTransportAudition           = 0x4000,
1153                 PostTransportScrub              = 0x8000,
1154                 PostTransportReverse            = 0x10000,
1155                 PostTransportInputChange        = 0x20000,
1156                 PostTransportCurveRealloc       = 0x40000
1157         };
1158         
1159         static const PostTransportWork ProcessCannotProceedMask = 
1160                 PostTransportWork (PostTransportInputChange|
1161                                    PostTransportSpeed|
1162                                    PostTransportReverse|
1163                                    PostTransportCurveRealloc|
1164                                    PostTransportScrub|
1165                                    PostTransportAudition|
1166                                    PostTransportLocate|
1167                                    PostTransportStop);
1168         
1169         PostTransportWork post_transport_work;
1170
1171         void             summon_butler ();
1172         void             schedule_butler_transport_work ();
1173         int              start_butler_thread ();
1174         void             terminate_butler_thread ();
1175         static void    *_butler_thread_work (void *arg);
1176         void*            butler_thread_work ();
1177
1178         uint32_t    cumulative_rf_motion;
1179         uint32_t    rf_scale;
1180
1181         void set_rf_speed (float speed);
1182         void reset_rf_scale (nframes_t frames_moved);
1183
1184         Locations        _locations;
1185         void              locations_changed ();
1186         void              locations_added (Location*);
1187         void              handle_locations_changed (Locations::LocationList&);
1188
1189         sigc::connection auto_punch_start_changed_connection;
1190         sigc::connection auto_punch_end_changed_connection;
1191         sigc::connection auto_punch_changed_connection;
1192         void             auto_punch_start_changed (Location *);
1193         void             auto_punch_end_changed (Location *);
1194         void             auto_punch_changed (Location *);
1195
1196         sigc::connection auto_loop_start_changed_connection;
1197         sigc::connection auto_loop_end_changed_connection;
1198         sigc::connection auto_loop_changed_connection;
1199         void             auto_loop_changed (Location *);
1200
1201         typedef list<Event *> Events;
1202         Events           events;
1203         Events           immediate_events;
1204         Events::iterator next_event;
1205
1206         /* there can only ever be one of each of these */
1207
1208         Event *auto_loop_event;
1209         Event *punch_out_event;
1210         Event *punch_in_event;
1211
1212         /* events */
1213
1214         void dump_events () const;
1215         void queue_event (Event *ev);
1216         void merge_event (Event*);
1217         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1218         bool _replace_event (Event*);
1219         bool _remove_event (Event *);
1220         void _clear_event_type (Event::Type);
1221
1222         void first_stage_init (string path, string snapshot_name);
1223         int  second_stage_init (bool new_tracks);
1224         void find_current_end ();
1225         void remove_empty_sounds ();
1226
1227         void setup_midi_control ();
1228         //int  midi_read (MIDI::Port *);
1229
1230         void enable_record ();
1231         
1232         void increment_transport_position (uint32_t val) {
1233                 if (max_frames - val < _transport_frame) {
1234                         _transport_frame = max_frames;
1235                 } else {
1236                         _transport_frame += val;
1237                 }
1238         }
1239
1240         void decrement_transport_position (uint32_t val) {
1241                 if (val < _transport_frame) {
1242                         _transport_frame -= val;
1243                 } else {
1244                         _transport_frame = 0;
1245                 }
1246         }
1247
1248         void post_transport_motion ();
1249         static void *session_loader_thread (void *arg);
1250
1251         void *do_work();
1252
1253         void set_next_event ();
1254         void process_event (Event *ev);
1255
1256         /* MIDI Machine Control */
1257
1258         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1259         //void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1260         //void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1261
1262         void spp_start (MIDI::Parser&);
1263         void spp_continue (MIDI::Parser&);
1264         void spp_stop (MIDI::Parser&);
1265
1266         void mmc_deferred_play (MIDI::MachineControl &);
1267         void mmc_stop (MIDI::MachineControl &);
1268         void mmc_step (MIDI::MachineControl &, int);
1269         void mmc_pause (MIDI::MachineControl &);
1270         void mmc_record_pause (MIDI::MachineControl &);
1271         void mmc_record_strobe (MIDI::MachineControl &);
1272         void mmc_record_exit (MIDI::MachineControl &);
1273         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1274         void mmc_fast_forward (MIDI::MachineControl &);
1275         void mmc_rewind (MIDI::MachineControl &);
1276         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1277         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1278         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1279
1280         struct timeval last_mmc_step;
1281         double step_speed;
1282
1283         typedef sigc::slot<bool> MidiTimeoutCallback;
1284         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1285
1286         MidiTimeoutList midi_timeouts;
1287         bool mmc_step_timeout ();
1288
1289         MIDI::byte mmc_buffer[32];
1290         MIDI::byte mtc_msg[16];
1291         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1292         MIDI::byte midi_msg[16];
1293         nframes_t  outbound_mtc_smpte_frame;
1294         SMPTE::Time transmitting_smpte_time;
1295         int next_quarter_frame_to_send;
1296         
1297         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1298         nframes_t _frames_per_hour;
1299         nframes_t _smpte_frames_per_hour;
1300         nframes_t _smpte_offset;
1301         bool _smpte_offset_negative;
1302
1303         /* cache the most-recently requested time conversions. This helps when we
1304          * have multiple clocks showing the same time (e.g. the transport frame) */
1305         bool           last_smpte_valid;
1306         nframes_t last_smpte_when;
1307         SMPTE::Time    last_smpte;
1308         
1309         bool _send_smpte_update; ///< Flag to send a full frame (SMPTE) MTC message this cycle
1310
1311         int send_full_time_code(nframes_t nframes);
1312         int send_midi_time_code_for_cycle(nframes_t nframes);
1313
1314         nframes_t adjust_apparent_position (nframes_t frames);
1315         
1316         void reset_record_status ();
1317         
1318         int no_roll (nframes_t nframes, nframes_t offset);
1319         
1320         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1321         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1322
1323         struct MIDIRequest {
1324             
1325             enum Type {
1326                     SendFullMTC,
1327                     SendMTC,
1328                     SendMMC,
1329                     PortChange,
1330                     SendMessage,
1331                     Deliver,
1332                     Quit
1333             };
1334             
1335             Type type;
1336             MIDI::MachineControl::Command mmc_cmd;
1337             nframes_t locate_frame;
1338
1339             // for SendMessage type
1340
1341             MIDI::Port * port;
1342             MIDI::channel_t chan;
1343             union {
1344                 MIDI::EventTwoBytes data;
1345                 MIDI::byte* buf;
1346             };
1347
1348             union { 
1349                 MIDI::eventType ev;
1350                 int32_t size;
1351             };
1352
1353             MIDIRequest () {}
1354             
1355             void *operator new(size_t ignored) {
1356                     return pool.alloc ();
1357             };
1358
1359             void operator delete(void *ptr, size_t size) {
1360                     pool.release (ptr);
1361             }
1362
1363           private:
1364             static MultiAllocSingleReleasePool pool;
1365         };
1366
1367         mutable  gint   butler_active;
1368         
1369         void          change_midi_ports ();
1370         int           use_config_midi_ports ();
1371
1372         bool waiting_to_start;
1373
1374         void set_play_loop (bool yn);
1375         void overwrite_some_buffers (Diskstream*);
1376         void flush_all_inserts ();
1377         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1378         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1379         void force_locate (nframes_t frame, bool with_roll = false);
1380         void set_diskstream_speed (Diskstream*, float speed);
1381         void set_transport_speed (float speed, bool abort = false);
1382         void stop_transport (bool abort = false);
1383         void start_transport ();
1384         void actually_start_transport ();
1385         void realtime_stop (bool abort);
1386         void non_realtime_start_scrub ();
1387         void non_realtime_set_speed ();
1388         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1389         void non_realtime_overwrite (int entry_request_count, bool& finished);
1390         void butler_transport_work ();
1391         void post_transport ();
1392         void engine_halted ();
1393         void xrun_recovery ();
1394
1395         TempoMap    *_tempo_map;
1396         void          tempo_map_changed (Change);
1397
1398         /* edit/mix groups */
1399
1400         int load_route_groups (const XMLNode&, bool is_edit);
1401         int load_edit_groups (const XMLNode&);
1402         int load_mix_groups (const XMLNode&);
1403
1404
1405         list<RouteGroup *> edit_groups;
1406         list<RouteGroup *> mix_groups;
1407
1408         /* disk-streams */
1409
1410         SerializedRCUManager<DiskstreamList>  diskstreams; 
1411
1412         uint32_t dstream_buffer_size;
1413         int  load_diskstreams (const XMLNode&);
1414
1415         /* routes stuff */
1416
1417         SerializedRCUManager<RouteList>  routes;
1418
1419         void   add_routes (RouteList&, bool save = true);
1420         uint32_t destructive_index;
1421
1422         int load_routes (const XMLNode&);
1423         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1424
1425         /* mixer stuff */
1426
1427         bool       solo_update_disabled;
1428         bool       currently_soloing;
1429         
1430         void route_mute_changed (void *src);
1431         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1432         void catch_up_on_solo ();
1433         void update_route_solo_state ();
1434         void modify_solo_mute (bool, bool);
1435         void strip_portname_for_solo (string& portname);
1436
1437         /* REGION MANAGEMENT */
1438
1439         mutable Glib::Mutex region_lock;
1440         typedef map<PBD::ID,boost::shared_ptr<Region> > RegionList;
1441         RegionList regions;
1442         
1443         void add_region (boost::shared_ptr<Region>);
1444         void region_changed (Change, boost::weak_ptr<Region>);
1445         void remove_region (boost::weak_ptr<Region>);
1446
1447         int load_regions (const XMLNode& node);
1448
1449         /* SOURCES */
1450         
1451         mutable Glib::Mutex source_lock;
1452         typedef std::map<PBD::ID,boost::shared_ptr<Source> > SourceMap;
1453
1454         SourceMap sources;
1455
1456         int load_sources (const XMLNode& node);
1457         XMLNode& get_sources_as_xml ();
1458
1459         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1460
1461         /* PLAYLISTS */
1462         
1463         mutable Glib::Mutex playlist_lock;
1464         typedef set<boost::shared_ptr<Playlist> > PlaylistList;
1465         PlaylistList playlists;
1466         PlaylistList unused_playlists;
1467
1468         int load_playlists (const XMLNode&);
1469         int load_unused_playlists (const XMLNode&);
1470         void remove_playlist (boost::weak_ptr<Playlist>);
1471         void track_playlist (bool, boost::weak_ptr<Playlist>);
1472
1473         boost::shared_ptr<Playlist> playlist_factory (string name);
1474         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1475
1476         void playlist_length_changed ();
1477         void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
1478
1479         /* NAMED SELECTIONS */
1480
1481         mutable Glib::Mutex named_selection_lock;
1482         typedef set<NamedSelection *> NamedSelectionList;
1483         NamedSelectionList named_selections;
1484
1485         int load_named_selections (const XMLNode&);
1486
1487         NamedSelection *named_selection_factory (string name);
1488         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1489
1490         /* CURVES and AUTOMATION LISTS */
1491         std::map<PBD::ID, Curve*> curves;
1492         std::map<PBD::ID, AutomationList*> automation_lists;
1493
1494         /* DEFAULT FADE CURVES */
1495
1496         float default_fade_steepness;
1497         float default_fade_msecs;
1498
1499         /* AUDITIONING */
1500
1501         boost::shared_ptr<Auditioner> auditioner;
1502         void set_audition (boost::shared_ptr<Region>);
1503         void non_realtime_set_audition ();
1504         boost::shared_ptr<Region> pending_audition_region;
1505
1506         /* EXPORT */
1507
1508         /* FLATTEN */
1509
1510         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1511
1512         /* INSERT AND SEND MANAGEMENT */
1513         
1514         list<PortInsert *>              _port_inserts;
1515         list<PluginInsert *>            _plugin_inserts;
1516         list<Send *>                    _sends;
1517         boost::dynamic_bitset<uint32_t> send_bitset;
1518         boost::dynamic_bitset<uint32_t> insert_bitset;
1519         uint32_t                        send_cnt;
1520         uint32_t                        insert_cnt;
1521
1522
1523         void add_processor (Processor *);
1524         void remove_processor (Processor *);
1525
1526         /* S/W RAID */
1527
1528         struct space_and_path {
1529             uint32_t blocks; /* 4kB blocks */
1530             string path;
1531             
1532             space_and_path() { 
1533                     blocks = 0;
1534             }
1535         };
1536
1537         struct space_and_path_ascending_cmp {
1538             bool operator() (space_and_path a, space_and_path b) {
1539                     return a.blocks > b.blocks;
1540             }
1541         };
1542         
1543         void setup_raid_path (string path);
1544
1545         vector<space_and_path> session_dirs;
1546         vector<space_and_path>::iterator last_rr_session_dir;
1547         uint32_t _total_free_4k_blocks;
1548         Glib::Mutex space_lock;
1549         
1550         string get_best_session_directory_for_new_source ();
1551         void refresh_disk_space ();
1552
1553         mutable gint _playback_load;
1554         mutable gint _capture_load;
1555         mutable gint _playback_load_min;
1556         mutable gint _capture_load_min;
1557
1558         /* I/O bundles */
1559
1560         typedef list<Bundle *> BundleList;
1561         mutable Glib::Mutex bundle_lock;
1562         BundleList  _bundles;
1563         int load_bundles (const XMLNode&);
1564
1565         void reverse_diskstream_buffers ();
1566
1567         UndoHistory _history;
1568         UndoTransaction* current_trans;
1569
1570         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1571         GlobalRouteMeterState get_global_route_metering ();
1572
1573         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1574         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1575
1576         void set_global_mute (GlobalRouteBooleanState s, void *src);
1577         void set_global_solo (GlobalRouteBooleanState s, void *src);
1578         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1579
1580         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1581         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1582         void reset_jack_connection (jack_client_t* jack);
1583         void record_enable_change_all (bool yn);
1584
1585         XMLNode& state(bool);
1586
1587         /* click track */
1588
1589         struct Click {
1590             nframes_t start;
1591             nframes_t duration;
1592             nframes_t offset;
1593             const Sample *data;
1594
1595             Click (nframes_t s, nframes_t d, const Sample *b) 
1596                     : start (s), duration (d), data (b) { offset = 0; }
1597             
1598             void *operator new(size_t ignored) {
1599                     return pool.alloc ();
1600             };
1601
1602             void operator delete(void *ptr, size_t size) {
1603                     pool.release (ptr);
1604             }
1605
1606           private:
1607             static Pool pool;
1608         };
1609  
1610         typedef list<Click*> Clicks;
1611
1612         Clicks          clicks;
1613         bool           _clicking;
1614         boost::shared_ptr<IO> _click_io;
1615         Sample*         click_data;
1616         Sample*         click_emphasis_data;
1617         nframes_t  click_length;
1618         nframes_t  click_emphasis_length;
1619         mutable Glib::RWLock click_lock;
1620
1621         static const Sample    default_click[];
1622         static const nframes_t default_click_length;
1623         static const Sample    default_click_emphasis[];
1624         static const nframes_t default_click_emphasis_length;
1625
1626         Click *get_click();
1627         void   setup_click_sounds (int which);
1628         void   clear_clicks ();
1629         void   click (nframes_t start, nframes_t nframes, nframes_t offset);
1630
1631         vector<Route*> master_outs;
1632         
1633         /* range playback */
1634
1635         list<AudioRange> current_audio_range;
1636         bool _play_range;
1637         void set_play_range (bool yn);
1638         void setup_auto_play ();
1639
1640         /* main outs */
1641         uint32_t main_outs;
1642         
1643         boost::shared_ptr<IO> _master_out;
1644         boost::shared_ptr<IO> _control_out;
1645
1646         gain_t* _gain_automation_buffer;
1647         pan_t** _pan_automation_buffer;
1648         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1649         uint32_t _npan_buffers;
1650
1651         nframes_t _automation_interval;
1652
1653         /* VST support */
1654
1655         long _vst_callback (VSTPlugin*,
1656                             long opcode,
1657                             long index,
1658                             long value,
1659                             void* ptr,
1660                             float opt);
1661
1662         /* number of hardware ports we're using,
1663            based on max (requested,available)
1664         */
1665
1666         uint32_t n_physical_outputs;
1667         uint32_t n_physical_inputs;
1668
1669         void remove_pending_capture_state ();
1670
1671         int find_all_sources (std::string path, std::set<std::string>& result);
1672         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1673
1674         LayerModel layer_model;
1675         CrossfadeModel xfade_model;
1676
1677         typedef std::set<boost::shared_ptr<PBD::Controllable> > Controllables;
1678         Glib::Mutex controllables_lock;
1679         Controllables controllables;
1680
1681         void reset_native_file_format();
1682         bool first_file_data_format_reset;
1683         bool first_file_header_format_reset;
1684
1685         void config_changed (const char*);
1686
1687         XMLNode& get_control_protocol_state ();
1688         
1689 };
1690
1691 } // namespace ARDOUR
1692
1693 #endif /* __ardour_session_h__ */