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