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