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