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