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