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