Various work on bundles. We now have a Bundle Manager dialogue, and hopefully things...
[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         Glib::ustring peak_path (Glib::ustring) const;
265
266         static string change_audio_path_by_name (string oldpath, string oldname, string newname, bool destructive);
267         static string change_midi_path_by_name (string oldpath, string oldname, string newname, bool destructive);
268         
269         string peak_path_from_audio_path (string) const;
270         string audio_path_from_name (string, uint32_t nchans, uint32_t chan, bool destructive);
271         string midi_path_from_name (string);
272
273         void process (nframes_t nframes);
274
275         BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
276         BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO);
277         BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
278         
279         void add_diskstream (boost::shared_ptr<Diskstream>);
280         boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
281         boost::shared_ptr<Diskstream> diskstream_by_name (string name);
282
283         bool have_captured() const { return _have_captured; }
284
285         void refill_all_diskstream_buffers ();
286         uint32_t diskstream_buffer_size() const { return dstream_buffer_size; }
287         
288         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
289         uint32_t n_diskstreams() const;
290         
291         typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
292         typedef std::list<boost::shared_ptr<Route> >      RouteList; 
293         
294         boost::shared_ptr<RouteList> get_routes() const {
295                 return routes.reader ();
296         }
297         
298         uint32_t nroutes() const { return routes.reader()->size(); }
299         uint32_t ntracks () const;
300         uint32_t nbusses () const;
301
302         struct RoutePublicOrderSorter {
303             bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
304         };
305         
306         template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
307         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
308         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg);
309
310         boost::shared_ptr<Route> route_by_name (string);
311         boost::shared_ptr<Route> route_by_id (PBD::ID);
312         boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
313
314         bool route_name_unique (string) const;
315
316         bool get_record_enabled() const { 
317                 return (record_status () >= Enabled);
318         }
319
320         RecordState record_status() const {
321                 return (RecordState) g_atomic_int_get (&_record_status);
322         }
323
324         bool actively_recording () {
325                 return record_status() == Recording;
326         }
327
328         bool record_enabling_legal () const;
329         void maybe_enable_record ();
330         void disable_record (bool rt_context, bool force = false);
331         void step_back_from_record ();
332         
333         void maybe_write_autosave ();
334
335         /* Proxy signal for region hidden changes */
336
337         sigc::signal<void,boost::shared_ptr<Region> > RegionHiddenChange;
338
339         /* Emitted when all i/o connections are complete */
340         
341         sigc::signal<void> IOConnectionsComplete;
342         
343         /* Record status signals */
344
345         sigc::signal<void> RecordStateChanged;
346
347         /* Transport mechanism signals */
348
349         sigc::signal<void> TransportStateChange; /* generic */
350         sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */
351         sigc::signal<void> DurationChanged;
352         sigc::signal<void> HaltOnXrun;
353         sigc::signal<void> TransportLooped;
354
355         sigc::signal<void,RouteList&> RouteAdded;
356
357         void request_roll ();
358         void request_bounded_roll (nframes_t start, nframes_t end);
359         void request_stop (bool abort = false);
360         void request_locate (nframes_t frame, bool with_roll = false);
361
362         void request_play_loop (bool yn);
363         bool get_play_loop () const { return play_loop; }
364
365         nframes_t  last_transport_start() const { return _last_roll_location; }
366         void goto_end ()   { request_locate (end_location->start(), false);}
367         void goto_start () { request_locate (start_location->start(), false); }
368         void set_session_start (nframes_t start) { start_location->set_start(start); }
369         void set_session_end (nframes_t end) { end_location->set_start(end); _end_location_is_free = false; }
370         void use_rf_shuttle_speed ();
371         void allow_auto_play (bool yn);
372         void request_transport_speed (float speed);
373         void request_overwrite_buffer (Diskstream*);
374         void request_diskstream_speed (Diskstream&, float speed);
375         void request_input_change_handling ();
376
377         bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
378         bool transport_locked () const;
379
380         int wipe ();
381         //int wipe_diskstream (AudioDiskstream *);
382
383         int remove_region_from_region_list (boost::shared_ptr<Region>);
384
385         nframes_t get_maximum_extent () const;
386         nframes_t current_end_frame() const { return end_location->start(); }
387         nframes_t current_start_frame() const { return start_location->start(); }
388         nframes_t frame_rate() const   { return _current_frame_rate; }
389         nframes_t frames_per_hour() const { return _frames_per_hour; }
390
391         double frames_per_smpte_frame() const { return _frames_per_smpte_frame; }
392         nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; }
393
394         float smpte_frames_per_second() const;
395         bool smpte_drop_frames() const;
396
397         /* Locations */
398
399         Locations *locations() { return &_locations; }
400
401         sigc::signal<void,Location*>    auto_loop_location_changed;
402         sigc::signal<void,Location*>    auto_punch_location_changed;
403         sigc::signal<void>              locations_modified;
404
405         void set_auto_punch_location (Location *);
406         void set_auto_loop_location (Location *);
407         int location_name(string& result, string base = string(""));
408
409         void reset_input_monitor_state ();
410
411         void add_event (nframes_t action_frame, Event::Type type, nframes_t target_frame = 0);
412         void remove_event (nframes_t frame, Event::Type type);
413         void clear_events (Event::Type type);
414
415         nframes_t get_block_size() const { return current_block_size; }
416         nframes_t worst_output_latency () const { return _worst_output_latency; }
417         nframes_t worst_input_latency () const { return _worst_input_latency; }
418         nframes_t worst_track_latency () const { return _worst_track_latency; }
419
420         int save_state (string snapshot_name, bool pending = false);
421         int restore_state (string snapshot_name);
422         int save_template (string template_name);
423         int save_history (string snapshot_name = "");
424         int restore_history (string snapshot_name);
425         void remove_state (string snapshot_name);
426         void rename_state (string old_name, string new_name);
427         void remove_pending_capture_state ();
428         
429         sigc::signal<void,string> StateSaved;
430         sigc::signal<void> StateReady;
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         AudioEngine const & engine () const { return _engine; }
494
495         int32_t  max_level;
496         int32_t  min_level;
497
498         /* Time */
499
500         nframes_t transport_frame () const {return _transport_frame; }
501         nframes_t audible_frame () const;
502
503         enum PullupFormat {
504                 pullup_Plus4Plus1,
505                 pullup_Plus4,
506                 pullup_Plus4Minus1,
507                 pullup_Plus1,
508                 pullup_None,
509                 pullup_Minus1,
510                 pullup_Minus4Plus1,
511                 pullup_Minus4,
512                 pullup_Minus4Minus1
513         };
514
515         int  set_smpte_format (SmpteFormat);
516         void sync_time_vars();
517
518         void bbt_time (nframes_t when, BBT_Time&);
519         void smpte_to_sample( SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes ) const;
520         void sample_to_smpte( nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
521         void smpte_time (SMPTE::Time &);
522         void smpte_time (nframes_t when, SMPTE::Time&);
523         void smpte_time_subframes (nframes_t when, SMPTE::Time&);
524
525         void smpte_duration (nframes_t, SMPTE::Time&) const;
526         void smpte_duration_string (char *, nframes_t) const;
527
528         void           set_smpte_offset (nframes_t);
529         nframes_t smpte_offset () const { return _smpte_offset; }
530         void           set_smpte_offset_negative (bool);
531         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
532
533         nframes_t convert_to_frames_at (nframes_t position, AnyTime&);
534
535         static sigc::signal<void> StartTimeChanged;
536         static sigc::signal<void> EndTimeChanged;
537         static sigc::signal<void> SMPTEOffsetChanged;
538
539         void        request_slave_source (SlaveSource);
540         bool        synced_to_jack() const { return Config->get_slave_source() == JACK; }
541
542         float       transport_speed() const { return _transport_speed; }
543         bool        transport_stopped() const { return _transport_speed == 0.0f; }
544         bool        transport_rolling() const { return _transport_speed != 0.0f; }
545
546         int jack_slave_sync (nframes_t);
547
548         TempoMap& tempo_map() { return *_tempo_map; }
549         
550         /* region info  */
551
552         sigc::signal<void,boost::shared_ptr<Region> > RegionAdded;
553         sigc::signal<void,boost::shared_ptr<Region> > RegionRemoved;
554
555         int region_name (string& result, string base = string(""), bool newlevel = false) const;
556         string new_region_name (string);
557         string path_from_region_name (DataType type, string name, string identifier);
558
559         boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>);
560         
561         void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
562
563         boost::shared_ptr<Region>      XMLRegionFactory (const XMLNode&, bool full);
564         boost::shared_ptr<AudioRegion> XMLAudioRegionFactory (const XMLNode&, bool full);
565         boost::shared_ptr<MidiRegion>  XMLMidiRegionFactory (const XMLNode&, bool full);
566
567         template<class T> void foreach_region (T *obj, void (T::*func)(boost::shared_ptr<Region>));
568
569         /* source management */
570
571         struct import_status : public InterThreadInfo {
572             string doing_what;
573             
574             /* control info */
575             bool sample_convert;
576             SrcQuality quality;
577             volatile bool freeze;
578             std::vector<Glib::ustring> paths;
579             
580             /* result */
581             SourceList sources;
582             
583         };
584
585         int import_audiofile (import_status&);
586         bool sample_rate_convert (import_status&, string infile, string& outfile);
587         string build_tmp_convert_name (string file);
588
589         SlaveSource post_export_slave;
590         nframes_t post_export_position;
591
592         int start_audio_export (ARDOUR::AudioExportSpecification&);
593         int stop_audio_export (ARDOUR::AudioExportSpecification&);
594         void finalize_audio_export ();
595
596         void add_source (boost::shared_ptr<Source>);
597         void remove_source (boost::weak_ptr<Source>);
598
599         struct cleanup_report {
600                 vector<string> paths;
601                 int64_t        space;
602         };
603
604         int  cleanup_sources (cleanup_report&);
605         int  cleanup_trash_sources (cleanup_report&);
606
607         int destroy_region (boost::shared_ptr<Region>);
608         int destroy_regions (std::list<boost::shared_ptr<Region> >);
609
610         int remove_last_capture ();
611
612         /* handlers should return -1 for "stop cleanup", 0 for
613            "yes, delete this playlist" and 1 for "no, don't delete
614            this playlist.
615         */
616         
617         sigc::signal<int,boost::shared_ptr<ARDOUR::Playlist> > AskAboutPlaylistDeletion;
618
619         /* handlers should return !0 for use pending state, 0 for
620            ignore it.
621         */
622
623         static sigc::signal<int> AskAboutPendingState;
624         
625         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
626
627         boost::shared_ptr<MidiSource> create_midi_source_for_session (ARDOUR::MidiDiskstream&);
628
629         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
630         boost::shared_ptr<Source> source_by_path_and_channel (const Glib::ustring&, uint16_t);
631
632         /* playlist management */
633
634         boost::shared_ptr<Playlist> playlist_by_name (string name);
635         void add_playlist (boost::shared_ptr<Playlist>);
636         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistAdded;
637         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistRemoved;
638
639         uint32_t n_playlists() const;
640
641         template<class T> void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
642         void get_playlists (std::vector<boost::shared_ptr<Playlist> >&);
643
644         /* named selections */
645
646         NamedSelection* named_selection_by_name (string name);
647         void add_named_selection (NamedSelection *);
648         void remove_named_selection (NamedSelection *);
649
650         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
651         sigc::signal<void> NamedSelectionAdded;
652         sigc::signal<void> NamedSelectionRemoved;
653
654         /* Curves and AutomationLists (TODO when they go away) */
655         void add_curve(Curve*);
656         void add_automation_list(AutomationList*);
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         void foreach_bundle (sigc::slot<void, boost::shared_ptr<Bundle> >);
717         void add_bundle (boost::shared_ptr<Bundle>);
718         void remove_bundle (boost::shared_ptr<Bundle>);
719         boost::shared_ptr<Bundle> bundle_by_name (string) const;
720
721         sigc::signal<void,boost::shared_ptr<Bundle> > BundleAdded;
722         sigc::signal<void,boost::shared_ptr<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_receive_device_id (uint32_t id);
748         void set_mmc_send_device_id (uint32_t id);
749         
750         /* Scrubbing */
751
752         void start_scrub (nframes_t where);
753         void stop_scrub ();
754         void set_scrub_speed (float);
755         nframes_t scrub_buffer_size() const;
756         sigc::signal<void> ScrubReady;
757
758         /* History (for editors, mixers, UIs etc.) */
759
760         /** Undo some transactions.
761          * @param n Number of transactions to undo.
762          */
763         void undo (uint32_t n) {
764                 _history.undo (n);
765         }
766
767         void redo (uint32_t n) {
768                 _history.redo (n);
769         }
770
771         UndoHistory& history() { return _history; }
772         
773         uint32_t undo_depth() const { return _history.undo_depth(); }
774         uint32_t redo_depth() const { return _history.redo_depth(); }
775         string next_undo() const { return _history.next_undo(); }
776         string next_redo() const { return _history.next_redo(); }
777
778         void begin_reversible_command (const string& cmd_name);
779         void commit_reversible_command (Command* cmd = 0);
780
781         void add_command (Command *const cmd) {
782                 current_trans->add_command (cmd);
783         }
784
785         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
786
787         // these commands are implemented in libs/ardour/session_command.cc
788         Command* memento_command_factory(XMLNode* n);
789         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
790
791         Command* global_state_command_factory (const XMLNode& n);
792
793         class GlobalRouteStateCommand : public Command
794         {
795           public:
796                 GlobalRouteStateCommand (Session&, void*);
797                 GlobalRouteStateCommand (Session&, const XMLNode& node);
798                 int set_state (const XMLNode&);
799                 XMLNode& get_state ();
800
801           protected:
802                 GlobalRouteBooleanState before, after;
803                 Session& sess;
804                 void* src;
805                 
806         };
807
808         class GlobalSoloStateCommand : public GlobalRouteStateCommand
809         {
810           public:
811                 GlobalSoloStateCommand (Session &, void *src);
812                 GlobalSoloStateCommand (Session&, const XMLNode&);
813                 void operator()(); //redo
814                 void undo();
815                 XMLNode &get_state();
816                 void mark();
817         };
818
819         class GlobalMuteStateCommand : public GlobalRouteStateCommand
820         {
821           public:
822                 GlobalMuteStateCommand(Session &, void *src);
823                 GlobalMuteStateCommand (Session&, const XMLNode&);
824                 void operator()(); // redo
825                 void undo();
826                 XMLNode &get_state();
827                 void mark();
828         };
829
830         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
831         {
832           public:
833                 GlobalRecordEnableStateCommand(Session &, void *src);
834                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
835                 void operator()(); // redo
836                 void undo();
837                 XMLNode &get_state();
838                 void mark();
839         };
840
841         class GlobalMeteringStateCommand : public Command
842         {
843           public:
844                 GlobalMeteringStateCommand(Session &, void *src);
845                 GlobalMeteringStateCommand (Session&, const XMLNode&);
846                 void operator()();
847                 void undo();
848                 XMLNode &get_state();
849                 int set_state (const XMLNode&);
850                 void mark();
851
852           protected:
853                 Session& sess;
854                 void* src;
855                 GlobalRouteMeterState before;
856                 GlobalRouteMeterState after;
857         };
858
859         /* clicking */
860
861         boost::shared_ptr<IO>  click_io() { return _click_io; }
862                 
863         /* tempo FX */
864
865         struct TimeStretchRequest {
866                 boost::shared_ptr<ARDOUR::AudioRegion> region;
867                 float fraction; /* session: read ; GUI: write */
868                 float progress; /* session: write ; GUI: read */
869                 bool  running;  /* read/write */
870                 bool  quick_seek; /* GUI: write */
871                 bool  antialias;  /* GUI: write */
872
873                 TimeStretchRequest () {} 
874         };
875
876         boost::shared_ptr<AudioRegion> tempoize_region (TimeStretchRequest&);
877
878         /* disk, buffer loads */
879
880         uint32_t playback_load ();
881         uint32_t capture_load ();
882         uint32_t playback_load_min ();
883         uint32_t capture_load_min ();
884
885         void reset_playback_load_min ();
886         void reset_capture_load_min ();
887         
888         float read_data_rate () const;
889         float write_data_rate () const;
890
891         /* ranges */
892
893         void set_audio_range (list<AudioRange>&);
894         void set_music_range (list<MusicRange>&);
895
896         void request_play_range (bool yn);
897         bool get_play_range () const { return _play_range; }
898
899         /* buffers for gain and pan */
900
901         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
902         pan_t** pan_automation_buffer () const  { return _pan_automation_buffer; }
903
904         /* buffers for conversion */
905         enum RunContext {
906                 ButlerContext = 0,
907                 TransportContext,
908                 ExportContext
909         };
910         
911         /* VST support */
912
913         static long vst_callback (AEffect* effect,
914                                   long opcode,
915                                   long index,
916                                   long value,
917                                   void* ptr,
918                                   float opt);
919
920         static sigc::signal<void> SendFeedback;
921
922         /* Controllables */
923
924         boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
925
926         void add_controllable (boost::shared_ptr<PBD::Controllable>);
927         void remove_controllable (PBD::Controllable*);
928
929   protected:
930         friend class AudioEngine;
931         void set_block_size (nframes_t nframes);
932         void set_frame_rate (nframes_t nframes);
933
934   protected:
935         friend class Diskstream;
936         void stop_butler ();
937         void wait_till_butler_finished();
938
939   protected:
940         friend class Route;
941         void schedule_curve_reallocation ();
942         void update_latency_compensation (bool, bool);
943         
944   private:
945         void destroy ();
946
947         void initialize_start_and_end_locations(nframes_t start, nframes_t end);
948         bool create_session_file();
949         bool create_session_file_from_template (const string& template_path);
950
951         nframes_t compute_initial_length ();
952
953         enum SubState {
954                 PendingDeclickIn   = 0x1,
955                 PendingDeclickOut  = 0x2,
956                 StopPendingCapture = 0x4,
957                 AutoReturning      = 0x10,
958                 PendingLocate      = 0x20,
959                 PendingSetLoop     = 0x40
960         };
961
962         /* stuff used in process() should be close together to
963            maximise cache hits
964         */
965
966         typedef void (Session::*process_function_type)(nframes_t);
967
968         AudioEngine            &_engine;
969         mutable gint            processing_prohibited;
970         /// the function called when the main JACK process callback happens
971         process_function_type    process_function;
972         process_function_type    last_process_function;
973         bool                     waiting_for_sync_offset;
974         nframes_t          _base_frame_rate;
975         nframes_t          _current_frame_rate;  //this includes video pullup offset
976         int                      transport_sub_state;
977         mutable gint           _record_status;
978         nframes_t          _transport_frame;
979         Location*                end_location;
980         Location*                start_location;
981         Slave                  *_slave;
982         volatile float          _transport_speed;
983         volatile float          _desired_transport_speed;
984         float                   _last_transport_speed;
985         bool                     auto_play_legal;
986         nframes_t          _last_slave_transport_frame;
987         nframes_t           maximum_output_latency;
988         nframes_t           last_stop_frame;
989         BufferSet*              _scratch_buffers;
990         BufferSet*              _silent_buffers;
991         BufferSet*              _mix_buffers;
992         nframes_t           current_block_size;
993         nframes_t          _worst_output_latency;
994         nframes_t          _worst_input_latency;
995         nframes_t          _worst_track_latency;
996         bool                    _have_captured;
997         float                   _meter_hold;
998         float                   _meter_falloff;
999         bool                    _end_location_is_free;
1000
1001         void set_worst_io_latencies ();
1002         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1003                 set_worst_io_latencies ();
1004         }
1005
1006         void update_latency_compensation_proxy (void* ignored);
1007
1008         void ensure_buffers (ChanCount howmany);
1009         
1010         void process_scrub          (nframes_t);
1011         void process_without_events (nframes_t);
1012         void process_with_events    (nframes_t);
1013         void process_audition       (nframes_t);
1014         int  process_export         (nframes_t, ARDOUR::AudioExportSpecification*);
1015         
1016         /* slave tracking */
1017
1018         static const int delta_accumulator_size = 25;
1019         int delta_accumulator_cnt;
1020         long delta_accumulator[delta_accumulator_size];
1021         long average_slave_delta;
1022         int  average_dir;
1023         bool have_first_delta_accumulator;
1024         
1025         enum SlaveState {
1026                 Stopped,
1027                 Waiting,
1028                 Running
1029         };
1030         
1031         SlaveState slave_state;
1032         nframes_t slave_wait_end;
1033
1034         void reset_slave_state ();
1035         bool follow_slave (nframes_t, nframes_t);
1036         void set_slave_source (SlaveSource);
1037
1038         bool _exporting;
1039         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1040
1041         void prepare_diskstreams ();
1042         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1043         int  process_routes (nframes_t, nframes_t);
1044         int  silent_process_routes (nframes_t, nframes_t);
1045
1046         bool get_rec_monitors_input () {
1047                 if (actively_recording()) {
1048                         return true;
1049                 } else {
1050                         if (Config->get_auto_input()) {
1051                                 return false;
1052                         } else {
1053                                 return true;
1054                         }
1055                 }
1056         }
1057
1058         int get_transport_declick_required () {
1059
1060                 if (transport_sub_state & PendingDeclickIn) {
1061                         transport_sub_state &= ~PendingDeclickIn;
1062                         return 1;
1063                 } else if (transport_sub_state & PendingDeclickOut) {
1064                         return -1;
1065                 } else {
1066                         return 0;
1067                 }
1068         }
1069
1070         bool maybe_stop (nframes_t limit) {
1071                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1072                         stop_transport ();
1073                         return true;
1074                 }
1075                 return false;
1076         }
1077
1078         bool maybe_sync_start (nframes_t&, nframes_t&);
1079
1080         void check_declick_out ();
1081
1082         MIDI::MachineControl*    mmc;
1083         MIDI::Port*             _mmc_port;
1084         MIDI::Port*             _mtc_port;
1085         MIDI::Port*             _midi_port;
1086         string                  _path;
1087         string                  _name;
1088         bool                     session_send_mmc;
1089         bool                     session_send_mtc;
1090         bool                     session_midi_feedback;
1091         bool                     play_loop;
1092         bool                     loop_changing;
1093         nframes_t                last_loopend;
1094
1095         boost::scoped_ptr<SessionDirectory> _session_dir;
1096
1097         RingBuffer<Event*> pending_events;
1098
1099         void hookup_io ();
1100         void when_engine_running ();
1101         void graph_reordered ();
1102
1103         string _current_snapshot_name;
1104
1105         XMLTree* state_tree;
1106         bool     state_was_pending;
1107         StateOfTheState _state_of_the_state;
1108
1109         void     auto_save();
1110         int      load_options (const XMLNode&);
1111         XMLNode& get_options () const;
1112         int      load_state (string snapshot_name);
1113         bool     save_config_options_predicate (ConfigVariableBase::Owner owner) const;
1114
1115         nframes_t _last_roll_location;
1116         nframes_t _last_record_location;
1117
1118         bool              pending_locate_roll;
1119         nframes_t         pending_locate_frame;
1120         bool              pending_locate_flush;
1121         bool              pending_abort;
1122         bool              pending_auto_loop;
1123         
1124         Sample*           butler_mixdown_buffer;
1125         float*            butler_gain_buffer;
1126         pthread_t         butler_thread;
1127         Glib::Mutex       butler_request_lock;
1128         Glib::Cond        butler_paused;
1129         bool              butler_should_run;
1130         mutable gint      butler_should_do_transport_work;
1131         int               butler_request_pipe[2];
1132
1133         inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); }
1134         
1135         struct ButlerRequest {
1136             enum Type {
1137                     Wake,
1138                     Run,
1139                     Pause,
1140                     Quit
1141             };
1142         };
1143
1144         enum PostTransportWork {
1145                 PostTransportStop               = 0x1,
1146                 PostTransportDisableRecord      = 0x2,
1147                 PostTransportPosition           = 0x8,
1148                 PostTransportDidRecord          = 0x20,
1149                 PostTransportDuration           = 0x40,
1150                 PostTransportLocate             = 0x80,
1151                 PostTransportRoll               = 0x200,
1152                 PostTransportAbort              = 0x800,
1153                 PostTransportOverWrite          = 0x1000,
1154                 PostTransportSpeed              = 0x2000,
1155                 PostTransportAudition           = 0x4000,
1156                 PostTransportScrub              = 0x8000,
1157                 PostTransportReverse            = 0x10000,
1158                 PostTransportInputChange        = 0x20000,
1159                 PostTransportCurveRealloc       = 0x40000
1160         };
1161         
1162         static const PostTransportWork ProcessCannotProceedMask = 
1163                 PostTransportWork (PostTransportInputChange|
1164                                    PostTransportSpeed|
1165                                    PostTransportReverse|
1166                                    PostTransportCurveRealloc|
1167                                    PostTransportScrub|
1168                                    PostTransportAudition|
1169                                    PostTransportLocate|
1170                                    PostTransportStop);
1171         
1172         PostTransportWork post_transport_work;
1173
1174         void             summon_butler ();
1175         void             schedule_butler_transport_work ();
1176         int              start_butler_thread ();
1177         void             terminate_butler_thread ();
1178         static void    *_butler_thread_work (void *arg);
1179         void*            butler_thread_work ();
1180
1181         uint32_t    cumulative_rf_motion;
1182         uint32_t    rf_scale;
1183
1184         void set_rf_speed (float speed);
1185         void reset_rf_scale (nframes_t frames_moved);
1186
1187         Locations        _locations;
1188         void              locations_changed ();
1189         void              locations_added (Location*);
1190         void              handle_locations_changed (Locations::LocationList&);
1191
1192         sigc::connection auto_punch_start_changed_connection;
1193         sigc::connection auto_punch_end_changed_connection;
1194         sigc::connection auto_punch_changed_connection;
1195         void             auto_punch_start_changed (Location *);
1196         void             auto_punch_end_changed (Location *);
1197         void             auto_punch_changed (Location *);
1198
1199         sigc::connection auto_loop_start_changed_connection;
1200         sigc::connection auto_loop_end_changed_connection;
1201         sigc::connection auto_loop_changed_connection;
1202         void             auto_loop_changed (Location *);
1203
1204         typedef list<Event *> Events;
1205         Events           events;
1206         Events           immediate_events;
1207         Events::iterator next_event;
1208
1209         /* there can only ever be one of each of these */
1210
1211         Event *auto_loop_event;
1212         Event *punch_out_event;
1213         Event *punch_in_event;
1214
1215         /* events */
1216
1217         void dump_events () const;
1218         void queue_event (Event *ev);
1219         void merge_event (Event*);
1220         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1221         bool _replace_event (Event*);
1222         bool _remove_event (Event *);
1223         void _clear_event_type (Event::Type);
1224
1225         void first_stage_init (string path, string snapshot_name);
1226         int  second_stage_init (bool new_tracks);
1227         void find_current_end ();
1228         void remove_empty_sounds ();
1229
1230         void setup_midi_control ();
1231         //int  midi_read (MIDI::Port *);
1232
1233         void enable_record ();
1234         
1235         void increment_transport_position (uint32_t val) {
1236                 if (max_frames - val < _transport_frame) {
1237                         _transport_frame = max_frames;
1238                 } else {
1239                         _transport_frame += val;
1240                 }
1241         }
1242
1243         void decrement_transport_position (uint32_t val) {
1244                 if (val < _transport_frame) {
1245                         _transport_frame -= val;
1246                 } else {
1247                         _transport_frame = 0;
1248                 }
1249         }
1250
1251         void post_transport_motion ();
1252         static void *session_loader_thread (void *arg);
1253
1254         void *do_work();
1255
1256         void set_next_event ();
1257         void process_event (Event *ev);
1258
1259         /* MIDI Machine Control */
1260
1261         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1262         //void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1263         //void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1264
1265         void spp_start (MIDI::Parser&);
1266         void spp_continue (MIDI::Parser&);
1267         void spp_stop (MIDI::Parser&);
1268
1269         void mmc_deferred_play (MIDI::MachineControl &);
1270         void mmc_stop (MIDI::MachineControl &);
1271         void mmc_step (MIDI::MachineControl &, int);
1272         void mmc_pause (MIDI::MachineControl &);
1273         void mmc_record_pause (MIDI::MachineControl &);
1274         void mmc_record_strobe (MIDI::MachineControl &);
1275         void mmc_record_exit (MIDI::MachineControl &);
1276         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1277         void mmc_fast_forward (MIDI::MachineControl &);
1278         void mmc_rewind (MIDI::MachineControl &);
1279         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1280         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1281         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1282
1283         struct timeval last_mmc_step;
1284         double step_speed;
1285
1286         typedef sigc::slot<bool> MidiTimeoutCallback;
1287         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1288
1289         MidiTimeoutList midi_timeouts;
1290         bool mmc_step_timeout ();
1291
1292         MIDI::byte mmc_buffer[32];
1293         MIDI::byte mtc_msg[16];
1294         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1295         MIDI::byte midi_msg[16];
1296         nframes_t  outbound_mtc_smpte_frame;
1297         SMPTE::Time transmitting_smpte_time;
1298         int next_quarter_frame_to_send;
1299         
1300         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1301         nframes_t _frames_per_hour;
1302         nframes_t _smpte_frames_per_hour;
1303         nframes_t _smpte_offset;
1304         bool _smpte_offset_negative;
1305
1306         /* cache the most-recently requested time conversions. This helps when we
1307          * have multiple clocks showing the same time (e.g. the transport frame) */
1308         bool           last_smpte_valid;
1309         nframes_t last_smpte_when;
1310         SMPTE::Time    last_smpte;
1311         
1312         bool _send_smpte_update; ///< Flag to send a full frame (SMPTE) MTC message this cycle
1313
1314         int send_full_time_code(nframes_t nframes);
1315         int send_midi_time_code_for_cycle(nframes_t nframes);
1316
1317         nframes_t adjust_apparent_position (nframes_t frames);
1318         
1319         void reset_record_status ();
1320         
1321         int no_roll (nframes_t nframes, nframes_t offset);
1322         
1323         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1324         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1325
1326         struct MIDIRequest {
1327             
1328             enum Type {
1329                     SendFullMTC,
1330                     SendMTC,
1331                     SendMMC,
1332                     PortChange,
1333                     SendMessage,
1334                     Deliver,
1335                     Quit
1336             };
1337             
1338             Type type;
1339             MIDI::MachineControl::Command mmc_cmd;
1340             nframes_t locate_frame;
1341
1342             // for SendMessage type
1343
1344             MIDI::Port * port;
1345             MIDI::channel_t chan;
1346             union {
1347                 MIDI::EventTwoBytes data;
1348                 MIDI::byte* buf;
1349             };
1350
1351             union { 
1352                 MIDI::eventType ev;
1353                 int32_t size;
1354             };
1355
1356             MIDIRequest () {}
1357             
1358             void *operator new(size_t ignored) {
1359                     return pool.alloc ();
1360             };
1361
1362             void operator delete(void *ptr, size_t size) {
1363                     pool.release (ptr);
1364             }
1365
1366           private:
1367             static MultiAllocSingleReleasePool pool;
1368         };
1369
1370         mutable  gint   butler_active;
1371         
1372         void          change_midi_ports ();
1373         int           use_config_midi_ports ();
1374
1375         bool waiting_to_start;
1376
1377         void set_play_loop (bool yn);
1378         void overwrite_some_buffers (Diskstream*);
1379         void flush_all_inserts ();
1380         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1381         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1382         void force_locate (nframes_t frame, bool with_roll = false);
1383         void set_diskstream_speed (Diskstream*, float speed);
1384         void set_transport_speed (float speed, bool abort = false);
1385         void stop_transport (bool abort = false);
1386         void start_transport ();
1387         void actually_start_transport ();
1388         void realtime_stop (bool abort);
1389         void non_realtime_start_scrub ();
1390         void non_realtime_set_speed ();
1391         void non_realtime_locate ();
1392         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1393         void non_realtime_overwrite (int entry_request_count, bool& finished);
1394         void butler_transport_work ();
1395         void post_transport ();
1396         void engine_halted ();
1397         void xrun_recovery ();
1398
1399         TempoMap    *_tempo_map;
1400         void          tempo_map_changed (Change);
1401
1402         /* edit/mix groups */
1403
1404         int load_route_groups (const XMLNode&, bool is_edit);
1405         int load_edit_groups (const XMLNode&);
1406         int load_mix_groups (const XMLNode&);
1407
1408
1409         list<RouteGroup *> edit_groups;
1410         list<RouteGroup *> mix_groups;
1411
1412         /* disk-streams */
1413
1414         SerializedRCUManager<DiskstreamList>  diskstreams; 
1415
1416         uint32_t dstream_buffer_size;
1417         int  load_diskstreams (const XMLNode&);
1418
1419         /* routes stuff */
1420
1421         SerializedRCUManager<RouteList>  routes;
1422
1423         void   add_routes (RouteList&, bool save = true);
1424         uint32_t destructive_index;
1425
1426         int load_routes (const XMLNode&);
1427         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1428
1429         /* mixer stuff */
1430
1431         bool       solo_update_disabled;
1432         bool       currently_soloing;
1433         
1434         void route_mute_changed (void *src);
1435         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1436         void catch_up_on_solo ();
1437         void update_route_solo_state ();
1438         void modify_solo_mute (bool, bool);
1439         void strip_portname_for_solo (string& portname);
1440
1441         /* REGION MANAGEMENT */
1442
1443         mutable Glib::Mutex region_lock;
1444         typedef map<PBD::ID,boost::shared_ptr<Region> > RegionList;
1445         RegionList regions;
1446         
1447         void add_region (boost::shared_ptr<Region>);
1448         void region_changed (Change, boost::weak_ptr<Region>);
1449         void remove_region (boost::weak_ptr<Region>);
1450
1451         int load_regions (const XMLNode& node);
1452
1453         /* SOURCES */
1454         
1455         mutable Glib::Mutex source_lock;
1456         typedef std::map<PBD::ID,boost::shared_ptr<Source> > SourceMap;
1457
1458         SourceMap sources;
1459
1460         int load_sources (const XMLNode& node);
1461         XMLNode& get_sources_as_xml ();
1462
1463         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1464
1465         /* PLAYLISTS */
1466         
1467         mutable Glib::Mutex playlist_lock;
1468         typedef set<boost::shared_ptr<Playlist> > PlaylistList;
1469         PlaylistList playlists;
1470         PlaylistList unused_playlists;
1471
1472         int load_playlists (const XMLNode&);
1473         int load_unused_playlists (const XMLNode&);
1474         void remove_playlist (boost::weak_ptr<Playlist>);
1475         void track_playlist (bool, boost::weak_ptr<Playlist>);
1476
1477         boost::shared_ptr<Playlist> playlist_factory (string name);
1478         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1479
1480         void playlist_length_changed ();
1481         void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
1482
1483         /* NAMED SELECTIONS */
1484
1485         mutable Glib::Mutex named_selection_lock;
1486         typedef set<NamedSelection *> NamedSelectionList;
1487         NamedSelectionList named_selections;
1488
1489         int load_named_selections (const XMLNode&);
1490
1491         NamedSelection *named_selection_factory (string name);
1492         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1493
1494         /* CURVES and AUTOMATION LISTS */
1495         std::map<PBD::ID, Curve*> curves;
1496         std::map<PBD::ID, AutomationList*> automation_lists;
1497
1498         /* DEFAULT FADE CURVES */
1499
1500         float default_fade_steepness;
1501         float default_fade_msecs;
1502
1503         /* AUDITIONING */
1504
1505         boost::shared_ptr<Auditioner> auditioner;
1506         void set_audition (boost::shared_ptr<Region>);
1507         void non_realtime_set_audition ();
1508         boost::shared_ptr<Region> pending_audition_region;
1509
1510         /* EXPORT */
1511
1512         /* FLATTEN */
1513
1514         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1515
1516         /* INSERT AND SEND MANAGEMENT */
1517         
1518         list<PortInsert *>              _port_inserts;
1519         list<PluginInsert *>            _plugin_inserts;
1520         list<Send *>                    _sends;
1521         boost::dynamic_bitset<uint32_t> send_bitset;
1522         boost::dynamic_bitset<uint32_t> insert_bitset;
1523         uint32_t                        send_cnt;
1524         uint32_t                        insert_cnt;
1525
1526
1527         void add_processor (Processor *);
1528         void remove_processor (Processor *);
1529
1530         /* S/W RAID */
1531
1532         struct space_and_path {
1533             uint32_t blocks; /* 4kB blocks */
1534             string path;
1535             
1536             space_and_path() { 
1537                     blocks = 0;
1538             }
1539         };
1540
1541         struct space_and_path_ascending_cmp {
1542             bool operator() (space_and_path a, space_and_path b) {
1543                     return a.blocks > b.blocks;
1544             }
1545         };
1546         
1547         void setup_raid_path (string path);
1548
1549         vector<space_and_path> session_dirs;
1550         vector<space_and_path>::iterator last_rr_session_dir;
1551         uint32_t _total_free_4k_blocks;
1552         Glib::Mutex space_lock;
1553         
1554         string get_best_session_directory_for_new_source ();
1555         void refresh_disk_space ();
1556
1557         mutable gint _playback_load;
1558         mutable gint _capture_load;
1559         mutable gint _playback_load_min;
1560         mutable gint _capture_load_min;
1561
1562         /* I/O bundles */
1563
1564         typedef list<boost::shared_ptr<Bundle> > BundleList;
1565         mutable Glib::Mutex bundle_lock;
1566         BundleList _bundles;
1567         XMLNode* _bundle_xml_node;
1568         int load_bundles (XMLNode const &);
1569
1570         void reverse_diskstream_buffers ();
1571
1572         UndoHistory _history;
1573         UndoTransaction* current_trans;
1574
1575         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1576         GlobalRouteMeterState get_global_route_metering ();
1577
1578         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1579         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1580
1581         void set_global_mute (GlobalRouteBooleanState s, void *src);
1582         void set_global_solo (GlobalRouteBooleanState s, void *src);
1583         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1584
1585         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1586         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1587         void reset_jack_connection (jack_client_t* jack);
1588         void record_enable_change_all (bool yn);
1589
1590         XMLNode& state(bool);
1591
1592         /* click track */
1593
1594         struct Click {
1595             nframes_t start;
1596             nframes_t duration;
1597             nframes_t offset;
1598             const Sample *data;
1599
1600             Click (nframes_t s, nframes_t d, const Sample *b) 
1601                     : start (s), duration (d), data (b) { offset = 0; }
1602             
1603             void *operator new(size_t ignored) {
1604                     return pool.alloc ();
1605             };
1606
1607             void operator delete(void *ptr, size_t size) {
1608                     pool.release (ptr);
1609             }
1610
1611           private:
1612             static Pool pool;
1613         };
1614  
1615         typedef list<Click*> Clicks;
1616
1617         Clicks          clicks;
1618         bool           _clicking;
1619         boost::shared_ptr<IO> _click_io;
1620         Sample*         click_data;
1621         Sample*         click_emphasis_data;
1622         nframes_t  click_length;
1623         nframes_t  click_emphasis_length;
1624         mutable Glib::RWLock click_lock;
1625
1626         static const Sample    default_click[];
1627         static const nframes_t default_click_length;
1628         static const Sample    default_click_emphasis[];
1629         static const nframes_t default_click_emphasis_length;
1630
1631         Click *get_click();
1632         void   setup_click_sounds (int which);
1633         void   clear_clicks ();
1634         void   click (nframes_t start, nframes_t nframes, nframes_t offset);
1635
1636         vector<Route*> master_outs;
1637         
1638         /* range playback */
1639
1640         list<AudioRange> current_audio_range;
1641         bool _play_range;
1642         void set_play_range (bool yn);
1643         void setup_auto_play ();
1644
1645         /* main outs */
1646         uint32_t main_outs;
1647         
1648         boost::shared_ptr<IO> _master_out;
1649         boost::shared_ptr<IO> _control_out;
1650
1651         gain_t* _gain_automation_buffer;
1652         pan_t** _pan_automation_buffer;
1653         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1654         uint32_t _npan_buffers;
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
1673         int find_all_sources (std::string path, std::set<std::string>& result);
1674         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1675
1676         LayerModel layer_model;
1677         CrossfadeModel xfade_model;
1678
1679         typedef std::set<boost::shared_ptr<PBD::Controllable> > Controllables;
1680         Glib::Mutex controllables_lock;
1681         Controllables controllables;
1682
1683         void reset_native_file_format();
1684         bool first_file_data_format_reset;
1685         bool first_file_header_format_reset;
1686
1687         void config_changed (const char*);
1688
1689         XMLNode& get_control_protocol_state ();
1690         
1691         void set_history_depth (uint32_t depth);
1692         void sync_order_keys ();
1693 };
1694
1695 } // namespace ARDOUR
1696
1697 #endif /* __ardour_session_h__ */