344b79bcd1a80985e3059f25e53f5a3b6848bbac
[ardour.git] / libs / ardour / ardour / session.h
1 /*
2     Copyright (C) 2000 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_session_h__
21 #define __ardour_session_h__
22
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <stack>
27 #include <string>
28 #include <vector>
29 #include <stdint.h>
30
31 #include <boost/dynamic_bitset.hpp>
32 #include <boost/scoped_ptr.hpp>
33 #include <boost/weak_ptr.hpp>
34 #include <boost/utility.hpp>
35
36 #include <sndfile.h>
37
38 #include <glibmm/thread.h>
39
40 #include "pbd/error.h"
41 #include "pbd/pool.h"
42 #include "pbd/rcu.h"
43 #include "pbd/statefuldestructible.h"
44 #include "pbd/undo.h"
45
46 #include "midi++/mmc.h"
47 #include "midi++/types.h"
48
49 #include "pbd/destructible.h"
50 #include "pbd/stateful.h"
51
52 #include "ardour/ardour.h"
53 #include "ardour/chan_count.h"
54 #include "ardour/configuration.h"
55 #include "ardour/location.h"
56 #include "ardour/smpte.h"
57
58 class XMLTree;
59 class XMLNode;
60 class AEffect;
61
62 namespace MIDI {
63         class Port;
64 }
65
66 namespace PBD {
67         class Controllable;
68 }
69
70 namespace Evoral {
71         class Curve;
72 }
73
74 namespace ARDOUR {
75
76 class AudioDiskstream;
77 class AudioEngine;
78 class AudioFileSource;
79 class AudioRegion;
80 class AudioSource;
81 class AudioTrack;
82 class Auditioner;
83 class AutomationList;
84 class AuxInput;
85 class BufferSet;
86 class Bundle;
87 class ControlProtocolInfo;
88 class Diskstream;
89 class ExportHandler;
90 class ExportStatus;
91 class IO;
92 class IOProcessor;
93 class MidiDiskstream;
94 class MidiRegion;
95 class MidiSource;
96 class MidiTrack;
97 class NamedSelection;
98 class Playlist;
99 class PluginInsert;
100 class Port;
101 class PortInsert;
102 class Processor;
103 class Region;
104 class Return;
105 class Route;
106 class RouteGroup;
107 class SMFSource;
108 class Send;
109 class SessionDirectory;
110 class SessionMetadata;
111 class Slave;
112 class Source;
113 class TempoMap;
114 class VSTPlugin;
115
116 class Session : public PBD::StatefulDestructible, public boost::noncopyable
117 {
118   private:
119         typedef std::pair<boost::weak_ptr<Route>,bool> RouteBooleanState;
120         typedef std::vector<RouteBooleanState> GlobalRouteBooleanState;
121         typedef std::pair<boost::weak_ptr<Route>,MeterPoint> RouteMeterState;
122         typedef std::vector<RouteMeterState> GlobalRouteMeterState;
123
124   public:
125         enum RecordState {
126                 Disabled = 0,
127                 Enabled = 1,
128                 Recording = 2
129         };
130
131         struct Event {
132                 enum Type {
133                         SetTransportSpeed,
134                         SetDiskstreamSpeed,
135                         Locate,
136                         LocateRoll,
137                         LocateRollLocate,
138                         SetLoop,
139                         PunchIn,
140                         PunchOut,
141                         RangeStop,
142                         RangeLocate,
143                         Overwrite,
144                         SetSlaveSource,
145                         Audition,
146                         InputConfigurationChange,
147                         SetAudioRange,
148                         SetPlayRange,
149
150                         /* only one of each of these events can be queued at any one time */
151
152                         StopOnce,
153                         AutoLoop
154                 };
155
156                 enum Action {
157                         Add,
158                         Remove,
159                         Replace,
160                         Clear
161                 };
162
163                 Type             type;
164                 Action           action;
165                 nframes_t        action_frame;
166                 nframes_t        target_frame;
167                 double           speed;
168
169                 union {
170                         void*        ptr;
171                         bool         yes_or_no;
172                         nframes_t    target2_frame;
173                         SlaveSource  slave;
174                         Route*       route;
175                 };
176
177                 std::list<AudioRange> audio_range;
178                 std::list<MusicRange> music_range;
179                 
180                 boost::shared_ptr<Region> region;
181
182                 Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false)
183                         : type (t)
184                         , action (a)
185                         , action_frame (when)
186                         , target_frame (where)
187                         , speed (spd)
188                         , yes_or_no (yn)
189                 {}
190
191                 void set_ptr (void* p) {
192                         ptr = p;
193                 }
194
195                 bool before (const Event& other) const {
196                         return action_frame < other.action_frame;
197                 }
198
199                 bool after (const Event& other) const {
200                         return action_frame > other.action_frame;
201                 }
202
203                 static bool compare (const Event *e1, const Event *e2) {
204                         return e1->before (*e2);
205                 }
206
207                 void *operator new (size_t ignored) {
208                         return pool.alloc ();
209                 }
210
211                 void operator delete(void *ptr, size_t size) {
212                         pool.release (ptr);
213                 }
214
215                 static const nframes_t Immediate = 0;
216
217                 private:
218                 static MultiAllocSingleReleasePool pool;
219         };
220
221         /* creating from an XML file */
222
223         Session (AudioEngine&,
224                         const std::string& fullpath,
225                         const std::string& snapshot_name,
226                         std::string mix_template = "");
227
228         /* creating a new Session */
229
230         Session (AudioEngine&,
231                         std::string fullpath,
232                         std::string snapshot_name,
233                         AutoConnectOption input_auto_connect,
234                         AutoConnectOption output_auto_connect,
235                         uint32_t control_out_channels,
236                         uint32_t master_out_channels,
237                         uint32_t n_physical_in,
238                         uint32_t n_physical_out,
239                         nframes_t initial_length);
240
241         virtual ~Session ();
242
243         std::string path() const { return _path; }
244         std::string name() const { return _name; }
245         std::string snap_name() const { return _current_snapshot_name; }
246         std::string raid_path () const;
247
248         void set_snap_name ();
249
250         void set_dirty ();
251         void set_clean ();
252         bool dirty() const { return _state_of_the_state & Dirty; }
253         void set_deletion_in_progress ();
254         void clear_deletion_in_progress ();
255         bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
256         sigc::signal<void> DirtyChanged;
257
258         const SessionDirectory& session_directory () const { return *(_session_dir.get()); }
259
260         static sigc::signal<void> AutoBindingOn;
261         static sigc::signal<void> AutoBindingOff;
262
263         static sigc::signal<void,std::string> Dialog;
264
265         std::string sound_dir (bool with_path = true) const;
266         std::string peak_dir () const;
267         std::string dead_sound_dir () const;
268         std::string automation_dir () const;
269         std::string analysis_dir() const;
270
271         int ensure_subdirs ();
272
273         Glib::ustring peak_path (Glib::ustring) const;
274
275         static std::string change_source_path_by_name (std::string oldpath, std::string oldname, std::string newname, bool destructive);
276
277         std::string peak_path_from_audio_path (std::string) const;
278         std::string new_audio_source_name (const std::string&, uint32_t nchans, uint32_t chan, bool destructive);
279         std::string new_midi_source_name (const std::string&);
280         std::string new_source_path_from_name (DataType type, const std::string&);
281         RouteList new_route_from_template (uint32_t how_many, const std::string& template_path);
282
283         void process (nframes_t nframes);
284
285         BufferSet& get_silent_buffers (ChanCount count = ChanCount::ZERO);
286         BufferSet& get_scratch_buffers (ChanCount count = ChanCount::ZERO);
287         BufferSet& get_mix_buffers (ChanCount count = ChanCount::ZERO);
288
289         void add_diskstream (boost::shared_ptr<Diskstream>);
290         boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
291         boost::shared_ptr<Diskstream> diskstream_by_name (std::string name);
292         bool have_rec_enabled_diskstream () const;
293
294         bool have_captured() const { return _have_captured; }
295
296         void refill_all_diskstream_buffers ();
297         uint32_t audio_diskstream_buffer_size() const { return audio_dstream_buffer_size; }
298         uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
299
300         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
301         uint32_t n_diskstreams() const;
302
303         typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
304
305         int load_routes (const XMLNode&);
306         boost::shared_ptr<RouteList> get_routes() const {
307                 return routes.reader ();
308         }
309
310         uint32_t nroutes() const { return routes.reader()->size(); }
311         uint32_t ntracks () const;
312         uint32_t nbusses () const;
313
314         boost::shared_ptr<BundleList> bundles () {
315                 return _bundles.reader ();
316         }
317
318         struct RoutePublicOrderSorter {
319             bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
320         };
321         
322         void sync_order_keys (const char* base);
323
324         template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
325         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
326         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg);
327
328         boost::shared_ptr<Route> route_by_name (std::string);
329         boost::shared_ptr<Route> route_by_id (PBD::ID);
330         boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
331
332         bool route_name_unique (std::string) const;
333         bool route_name_internal (std::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(std::string& result, std::string base = std::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,std::string> StateSaved;
461         sigc::signal<void> StateReady;
462
463         std::vector<std::string*>* possible_states() const;
464         static std::vector<std::string*>* possible_states (std::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 (std::string);
487         RouteGroup* add_mix_group (std::string);
488
489         void remove_edit_group (RouteGroup&);
490         void remove_mix_group (RouteGroup&);
491
492         RouteGroup *mix_group_by_name (std::string);
493         RouteGroup *edit_group_by_name (std::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 (std::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 (std::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 (std::string& result, std::string base = std::string(""), bool newlevel = false);
602         std::string new_region_name (std::string);
603         std::string path_from_region_name (DataType type, std::string name, std::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                 std::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&, std::string infile, std::string& outfile);
633         std::string build_tmp_convert_name (std::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                 std::vector<std::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 (std::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 (std::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, std::vector<boost::shared_ptr<Source> >&, InterThreadInfo& wot,
728                                                    bool enable_processing = true);
729         int freeze (InterThreadInfo&);
730
731         /* session-wide solo/mute/rec-enable */
732
733         bool soloing() const { return currently_soloing; }
734
735         void set_all_solo (bool);
736         void set_all_mute (bool);
737
738         sigc::signal<void,bool> SoloActive;
739         sigc::signal<void> SoloChanged;
740
741         void record_disenable_all ();
742         void record_enable_all ();
743
744         /* control/master out */
745
746         boost::shared_ptr<IO> control_out() const { return _control_out; }
747         boost::shared_ptr<IO> master_out() const { return _master_out; }
748
749         /* insert/send management */
750
751         uint32_t n_port_inserts() const { return _port_inserts.size(); }
752         uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); }
753         uint32_t n_sends() const { return _sends.size(); }
754
755         static void set_disable_all_loaded_plugins (bool yn) {
756                 _disable_all_loaded_plugins = yn;
757         }
758         static bool get_disable_all_loaded_plugins() {
759                 return _disable_all_loaded_plugins;
760         }
761
762         uint32_t next_send_id();
763         uint32_t next_return_id();
764         uint32_t next_insert_id();
765         void mark_send_id (uint32_t);
766         void mark_return_id (uint32_t);
767         void mark_insert_id (uint32_t);
768
769         /* s/w "RAID" management */
770
771         nframes_t available_capture_duration();
772
773         /* I/O bundles */
774
775         void add_bundle (boost::shared_ptr<Bundle>);
776         void remove_bundle (boost::shared_ptr<Bundle>);
777         boost::shared_ptr<Bundle> bundle_by_name (std::string) const;
778
779         sigc::signal<void,boost::shared_ptr<Bundle> > BundleAdded;
780         sigc::signal<void,boost::shared_ptr<Bundle> > BundleRemoved;
781
782         /* MIDI control */
783
784         void midi_panic(void);
785         int set_mtc_port (std::string port_tag);
786         int set_mmc_port (std::string port_tag);
787         int set_midi_port (std::string port_tag);
788         int set_midi_clock_port (std::string port_tag);
789         MIDI::Port *mtc_port() const { return _mtc_port; }
790         MIDI::Port *mmc_port() const { return _mmc_port; }
791         MIDI::Port *midi_port() const { return _midi_port; }
792         MIDI::Port *midi_clock_port() const { return _midi_clock_port; }
793
794         sigc::signal<void> MTC_PortChanged;
795         sigc::signal<void> MMC_PortChanged;
796         sigc::signal<void> MIDI_PortChanged;
797         sigc::signal<void> MIDIClock_PortChanged;
798
799         void set_trace_midi_input (bool, MIDI::Port* port = 0);
800         void set_trace_midi_output (bool, MIDI::Port* port = 0);
801
802         bool get_trace_midi_input(MIDI::Port *port = 0);
803         bool get_trace_midi_output(MIDI::Port *port = 0);
804
805         void set_mmc_receive_device_id (uint32_t id);
806         void set_mmc_send_device_id (uint32_t id);
807
808         /* Scrubbing */
809
810         void start_scrub (nframes_t where);
811         void stop_scrub ();
812         void set_scrub_speed (float);
813         nframes_t scrub_buffer_size() const;
814         sigc::signal<void> ScrubReady;
815
816         /* History (for editors, mixers, UIs etc.) */
817
818         /** Undo some transactions.
819          * @param n Number of transactions to undo.
820          */
821         void undo (uint32_t n) {
822                 _history.undo (n);
823         }
824
825         void redo (uint32_t n) {
826                 _history.redo (n);
827         }
828
829         UndoHistory& history() { return _history; }
830
831         uint32_t undo_depth() const { return _history.undo_depth(); }
832         uint32_t redo_depth() const { return _history.redo_depth(); }
833         std::string next_undo() const { return _history.next_undo(); }
834         std::string next_redo() const { return _history.next_redo(); }
835
836         void begin_reversible_command (const std::string& cmd_name);
837         void commit_reversible_command (Command* cmd = 0);
838
839         void add_command (Command *const cmd) {
840                 assert(!_current_trans.empty ());
841                 _current_trans.top()->add_command (cmd);
842         }
843
844         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
845
846         // these commands are implemented in libs/ardour/session_command.cc
847         Command* memento_command_factory(XMLNode* n);
848         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
849
850         Command* global_state_command_factory (const XMLNode& n);
851
852         class GlobalRouteStateCommand : public Command
853         {
854           public:
855                 GlobalRouteStateCommand (Session&, void*);
856                 GlobalRouteStateCommand (Session&, const XMLNode& node);
857                 int set_state (const XMLNode&);
858                 XMLNode& get_state ();
859
860           protected:
861                 GlobalRouteBooleanState before, after;
862                 Session& sess;
863                 void* src;
864
865         };
866
867         class GlobalSoloStateCommand : public GlobalRouteStateCommand
868         {
869           public:
870                 GlobalSoloStateCommand (Session &, void *src);
871                 GlobalSoloStateCommand (Session&, const XMLNode&);
872                 void operator()(); //redo
873                 void undo();
874                 XMLNode &get_state();
875                 void mark();
876         };
877
878         class GlobalMuteStateCommand : public GlobalRouteStateCommand
879         {
880           public:
881                 GlobalMuteStateCommand(Session &, void *src);
882                 GlobalMuteStateCommand (Session&, const XMLNode&);
883                 void operator()(); // redo
884                 void undo();
885                 XMLNode &get_state();
886                 void mark();
887         };
888
889         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
890         {
891           public:
892                 GlobalRecordEnableStateCommand(Session &, void *src);
893                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
894                 void operator()(); // redo
895                 void undo();
896                 XMLNode &get_state();
897                 void mark();
898         };
899
900         class GlobalMeteringStateCommand : public Command
901         {
902           public:
903                 GlobalMeteringStateCommand(Session &, void *src);
904                 GlobalMeteringStateCommand (Session&, const XMLNode&);
905                 void operator()();
906                 void undo();
907                 XMLNode &get_state();
908                 int set_state (const XMLNode&);
909                 void mark();
910
911           protected:
912                 Session& sess;
913                 void* src;
914                 GlobalRouteMeterState before;
915                 GlobalRouteMeterState after;
916         };
917
918         /* clicking */
919
920         boost::shared_ptr<IO> click_io() { return _click_io; }
921
922         /* disk, buffer loads */
923
924         uint32_t playback_load ();
925         uint32_t capture_load ();
926         uint32_t playback_load_min ();
927         uint32_t capture_load_min ();
928
929         void reset_playback_load_min ();
930         void reset_capture_load_min ();
931
932         float read_data_rate () const; // in usec
933         float write_data_rate () const;
934
935         /* ranges */
936
937         void set_audio_range (std::list<AudioRange>&);
938         void set_music_range (std::list<MusicRange>&);
939
940         void request_play_range (bool yn);
941         bool get_play_range () const { return _play_range; }
942
943         /* buffers for gain and pan */
944
945         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
946         pan_t** pan_automation_buffer () const  { return _pan_automation_buffer; }
947         
948         void ensure_buffer_set (BufferSet& buffers, const ChanCount& howmany);
949
950         /* VST support */
951
952         static long vst_callback (AEffect* effect,
953                         long opcode,
954                         long index,
955                         long value,
956                         void* ptr,
957                         float opt);
958
959         static sigc::signal<void> SendFeedback;
960
961         /* Controllables */
962
963         boost::shared_ptr<PBD::Controllable> controllable_by_id (const PBD::ID&);
964
965         void add_controllable (boost::shared_ptr<PBD::Controllable>);
966         void remove_controllable (PBD::Controllable*);
967
968         SessionMetadata & metadata () { return *_metadata; }
969
970   protected:
971         friend class AudioEngine;
972         void set_block_size (nframes_t nframes);
973         void set_frame_rate (nframes_t nframes);
974
975   protected:
976         friend class Diskstream;
977         void stop_butler ();
978         void wait_till_butler_finished();
979
980   protected:
981         friend class Route;
982         void schedule_curve_reallocation ();
983         void update_latency_compensation (bool, bool);
984
985   private:
986         int  create (bool& new_session, const std::string& mix_template, nframes_t initial_length);
987         void destroy ();
988
989         nframes_t compute_initial_length ();
990
991         enum SubState {
992                 PendingDeclickIn   = 0x1,
993                 PendingDeclickOut  = 0x2,
994                 StopPendingCapture = 0x4,
995                 AutoReturning      = 0x10,
996                 PendingLocate      = 0x20,
997                 PendingSetLoop     = 0x40
998         };
999
1000         /* stuff used in process() should be close together to
1001            maximise cache hits
1002         */
1003
1004         typedef void (Session::*process_function_type)(nframes_t);
1005
1006         AudioEngine&            _engine;
1007         mutable gint             processing_prohibited;
1008         process_function_type    process_function;
1009         process_function_type    last_process_function;
1010         bool                     waiting_for_sync_offset;
1011         nframes_t               _base_frame_rate;
1012         nframes_t               _current_frame_rate;  //this includes video pullup offset
1013         nframes_t               _nominal_frame_rate;  //ignores audioengine setting, "native" SR
1014         int                      transport_sub_state;
1015         mutable gint            _record_status;
1016         volatile nframes_t      _transport_frame;
1017         Location*                end_location;
1018         Location*                start_location;
1019         Slave*                  _slave;
1020         bool                    _silent;
1021         volatile double         _transport_speed;
1022         double                  _last_transport_speed;
1023                                  // varispeed playback
1024         uint64_t                 phi;        // fixed point transport speed
1025         uint64_t                 target_phi; // fixed point target transport speed
1026         uint64_t                 phase;      // fixed point phase 
1027         bool                     auto_play_legal;
1028         nframes_t               _last_slave_transport_frame;
1029         nframes_t                maximum_output_latency;
1030         volatile nframes64_t    _requested_return_frame;
1031         BufferSet*              _scratch_buffers;
1032         BufferSet*              _silent_buffers;
1033         BufferSet*              _mix_buffers;
1034         nframes_t                current_block_size;
1035         nframes_t               _worst_output_latency;
1036         nframes_t               _worst_input_latency;
1037         nframes_t               _worst_track_latency;
1038         bool                    _have_captured;
1039         float                   _meter_hold;
1040         float                   _meter_falloff;
1041         bool                    _end_location_is_free;
1042
1043         void set_worst_io_latencies ();
1044         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1045                 set_worst_io_latencies ();
1046         }
1047
1048         void update_latency_compensation_proxy (void* ignored);
1049
1050         void ensure_buffers (ChanCount howmany);
1051
1052         void process_scrub          (nframes_t);
1053         void process_without_events (nframes_t);
1054         void process_with_events    (nframes_t);
1055         void process_audition       (nframes_t);
1056         void process_export         (nframes_t);
1057         int  process_export_fw      (nframes_t);
1058
1059         void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
1060         void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
1061         bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); }
1062
1063         /* slave tracking */
1064
1065         static const int delta_accumulator_size = 25;
1066         int delta_accumulator_cnt;
1067         long delta_accumulator[delta_accumulator_size];
1068         long average_slave_delta;
1069         int  average_dir;
1070         bool have_first_delta_accumulator;
1071
1072         enum SlaveState {
1073                 Stopped,
1074                 Waiting,
1075                 Running
1076         };
1077
1078         SlaveState slave_state;
1079         nframes_t slave_wait_end;
1080
1081         void reset_slave_state ();
1082         bool follow_slave (nframes_t);
1083         void calculate_moving_average_of_slave_delta(int dir, nframes_t this_delta);
1084         void track_slave_state(float slave_speed, nframes_t slave_transport_frame, 
1085                                nframes_t this_delta, bool starting);
1086         void follow_slave_silently(nframes_t nframes, float slave_speed);
1087         
1088         void set_slave_source (SlaveSource);
1089
1090         SlaveSource post_export_slave;
1091         nframes_t post_export_position;
1092
1093         bool _exporting;
1094         bool _exporting_realtime;
1095         
1096         boost::shared_ptr<ExportHandler> export_handler;
1097         boost::shared_ptr<ExportStatus>  export_status;
1098
1099         int  pre_export ();
1100         int  stop_audio_export ();
1101         void finalize_audio_export ();
1102         
1103         sigc::connection export_freewheel_connection;
1104
1105         void prepare_diskstreams ();
1106         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1107         int  process_routes (nframes_t);
1108         int  silent_process_routes (nframes_t);
1109
1110         bool get_rec_monitors_input () {
1111                 if (actively_recording()) {
1112                         return true;
1113                 } else {
1114                         if (Config->get_auto_input()) {
1115                                 return false;
1116                         } else {
1117                                 return true;
1118                         }
1119                 }
1120         }
1121
1122         int get_transport_declick_required () {
1123                 if (transport_sub_state & PendingDeclickIn) {
1124                         transport_sub_state &= ~PendingDeclickIn;
1125                         return 1;
1126                 } else if (transport_sub_state & PendingDeclickOut) {
1127                         return -1;
1128                 } else {
1129                         return 0;
1130                 }
1131         }
1132
1133         bool maybe_stop (nframes_t limit) {
1134                 if (   (_transport_speed > 0.0f && _transport_frame >= limit)
1135                     || (_transport_speed < 0.0f && _transport_frame == 0)    ) {
1136                         stop_transport ();
1137                         return true;
1138                 }
1139                 return false;
1140         }
1141
1142         bool maybe_sync_start (nframes_t&);
1143
1144         void check_declick_out ();
1145
1146         MIDI::MachineControl*    mmc;
1147         MIDI::Port*             _mmc_port;
1148         MIDI::Port*             _mtc_port;
1149         MIDI::Port*             _midi_port;
1150         MIDI::Port*             _midi_clock_port;
1151         std::string             _path;
1152         std::string             _name;
1153         bool                     session_send_mmc;
1154         bool                     session_send_mtc;
1155         bool                     session_midi_feedback;
1156         bool                     play_loop;
1157         bool                     loop_changing;
1158         nframes_t                last_loopend;
1159
1160         boost::scoped_ptr<SessionDirectory> _session_dir;
1161
1162         RingBuffer<Event*> pending_events;
1163
1164         void hookup_io ();
1165         void when_engine_running ();
1166         void graph_reordered ();
1167
1168         std::string _current_snapshot_name;
1169
1170         XMLTree* state_tree;
1171         bool     state_was_pending;
1172         StateOfTheState _state_of_the_state;
1173
1174         void     auto_save();
1175         int      load_options (const XMLNode&);
1176         XMLNode& get_options () const;
1177         int      load_state (std::string snapshot_name);
1178         bool     save_config_options_predicate (ConfigVariableBase::Owner owner) const;
1179
1180         nframes_t _last_roll_location;
1181         nframes_t _last_record_location;
1182
1183         bool              pending_locate_roll;
1184         nframes_t         pending_locate_frame;
1185         bool              pending_locate_flush;
1186         bool              pending_abort;
1187         bool              pending_auto_loop;
1188
1189         Sample*           butler_mixdown_buffer;
1190         float*            butler_gain_buffer;
1191         pthread_t         butler_thread;
1192         Glib::Mutex       butler_request_lock;
1193         Glib::Cond        butler_paused;
1194         bool              butler_should_run;
1195         mutable gint      butler_should_do_transport_work;
1196         int               butler_request_pipe[2];
1197
1198         inline bool transport_work_requested() const {
1199                 return g_atomic_int_get(&butler_should_do_transport_work);
1200         }
1201
1202         struct ButlerRequest {
1203                 enum Type {
1204                         Wake,
1205                         Run,
1206                         Pause,
1207                         Quit
1208                 };
1209         };
1210
1211         enum PostTransportWork {
1212                 PostTransportStop               = 0x1,
1213                 PostTransportDisableRecord      = 0x2,
1214                 PostTransportPosition           = 0x8,
1215                 PostTransportDidRecord          = 0x20,
1216                 PostTransportDuration           = 0x40,
1217                 PostTransportLocate             = 0x80,
1218                 PostTransportRoll               = 0x200,
1219                 PostTransportAbort              = 0x800,
1220                 PostTransportOverWrite          = 0x1000,
1221                 PostTransportSpeed              = 0x2000,
1222                 PostTransportAudition           = 0x4000,
1223                 PostTransportScrub              = 0x8000,
1224                 PostTransportReverse            = 0x10000,
1225                 PostTransportInputChange        = 0x20000,
1226                 PostTransportCurveRealloc       = 0x40000
1227         };
1228
1229         static const PostTransportWork ProcessCannotProceedMask =
1230                 PostTransportWork (
1231                                 PostTransportInputChange|
1232                                 PostTransportSpeed|
1233                                 PostTransportReverse|
1234                                 PostTransportCurveRealloc|
1235                                 PostTransportScrub|
1236                                 PostTransportAudition|
1237                                 PostTransportLocate|
1238                                 PostTransportStop);
1239
1240         PostTransportWork post_transport_work;
1241
1242         void             summon_butler ();
1243         void             schedule_butler_transport_work ();
1244         int              start_butler_thread ();
1245         void             terminate_butler_thread ();
1246         static void    *_butler_thread_work (void *arg);
1247         void*            butler_thread_work ();
1248
1249         uint32_t    cumulative_rf_motion;
1250         uint32_t    rf_scale;
1251
1252         void set_rf_speed (float speed);
1253         void reset_rf_scale (nframes_t frames_moved);
1254
1255         Locations        _locations;
1256         void              locations_changed ();
1257         void              locations_added (Location*);
1258         void              handle_locations_changed (Locations::LocationList&);
1259
1260         sigc::connection auto_punch_start_changed_connection;
1261         sigc::connection auto_punch_end_changed_connection;
1262         sigc::connection auto_punch_changed_connection;
1263         void             auto_punch_start_changed (Location *);
1264         void             auto_punch_end_changed (Location *);
1265         void             auto_punch_changed (Location *);
1266
1267         sigc::connection auto_loop_start_changed_connection;
1268         sigc::connection auto_loop_end_changed_connection;
1269         sigc::connection auto_loop_changed_connection;
1270         void             auto_loop_changed (Location *);
1271
1272         typedef std::list<Event *> Events;
1273         Events           events;
1274         Events           immediate_events;
1275         Events::iterator next_event;
1276
1277         /* there can only ever be one of each of these */
1278
1279         Event *auto_loop_event;
1280         Event *punch_out_event;
1281         Event *punch_in_event;
1282
1283         /* events */
1284
1285         void dump_events () const;
1286         void queue_event (Event *ev);
1287         void merge_event (Event*);
1288         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1289         bool _replace_event (Event*);
1290         bool _remove_event (Event *);
1291         void _clear_event_type (Event::Type);
1292
1293         void first_stage_init (std::string path, std::string snapshot_name);
1294         int  second_stage_init (bool new_tracks);
1295         void find_current_end ();
1296         void remove_empty_sounds ();
1297
1298         void setup_midi_control ();
1299         int  midi_read (MIDI::Port *);
1300
1301         void enable_record ();
1302
1303         void increment_transport_position (uint32_t val) {
1304                 if (max_frames - val < _transport_frame) {
1305                         _transport_frame = max_frames;
1306                 } else {
1307                         _transport_frame += val;
1308                 }
1309         }
1310
1311         void decrement_transport_position (uint32_t val) {
1312                 if (val < _transport_frame) {
1313                         _transport_frame -= val;
1314                 } else {
1315                         _transport_frame = 0;
1316                 }
1317         }
1318
1319         void post_transport_motion ();
1320         static void *session_loader_thread (void *arg);
1321
1322         void *do_work();
1323
1324         void set_next_event ();
1325         void process_event (Event *ev);
1326
1327         /* MIDI Machine Control */
1328
1329         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1330
1331         void spp_start (MIDI::Parser&, nframes_t timestamp);
1332         void spp_continue (MIDI::Parser&, nframes_t timestamp);
1333         void spp_stop (MIDI::Parser&, nframes_t timestamp);
1334
1335         void mmc_deferred_play (MIDI::MachineControl &);
1336         void mmc_stop (MIDI::MachineControl &);
1337         void mmc_step (MIDI::MachineControl &, int);
1338         void mmc_pause (MIDI::MachineControl &);
1339         void mmc_record_pause (MIDI::MachineControl &);
1340         void mmc_record_strobe (MIDI::MachineControl &);
1341         void mmc_record_exit (MIDI::MachineControl &);
1342         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1343         void mmc_fast_forward (MIDI::MachineControl &);
1344         void mmc_rewind (MIDI::MachineControl &);
1345         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1346         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1347         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1348
1349         struct timeval last_mmc_step;
1350         double step_speed;
1351
1352         typedef sigc::slot<bool> MidiTimeoutCallback;
1353         typedef std::list<MidiTimeoutCallback> MidiTimeoutList;
1354
1355         MidiTimeoutList midi_timeouts;
1356         bool mmc_step_timeout ();
1357
1358         MIDI::byte mmc_buffer[32];
1359         MIDI::byte mtc_msg[16];
1360         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1361         MIDI::byte midi_msg[16];
1362         nframes_t  outbound_mtc_smpte_frame;
1363         SMPTE::Time transmitting_smpte_time;
1364         int next_quarter_frame_to_send;
1365
1366         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1367         nframes_t _frames_per_hour;
1368         nframes_t _smpte_frames_per_hour;
1369         nframes_t _smpte_offset;
1370         bool _smpte_offset_negative;
1371
1372         /* cache the most-recently requested time conversions. This helps when we
1373          * have multiple clocks showing the same time (e.g. the transport frame) */
1374         bool           last_smpte_valid;
1375         nframes_t last_smpte_when;
1376         SMPTE::Time    last_smpte;
1377
1378         bool _send_smpte_update; ///< Flag to send a full frame (SMPTE) MTC message this cycle
1379
1380         int send_full_time_code(nframes_t nframes);
1381         int send_midi_time_code_for_cycle(nframes_t nframes);
1382
1383         nframes_t adjust_apparent_position (nframes_t frames);
1384
1385         void reset_record_status ();
1386
1387         int no_roll (nframes_t nframes);
1388         int fail_roll (nframes_t nframes);
1389
1390         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1391         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1392
1393         struct MIDIRequest {
1394                 enum Type {
1395                         PortChange,
1396                         Quit
1397                 };
1398                 Type type;
1399         };
1400
1401         Glib::Mutex  midi_lock;
1402         pthread_t    midi_thread;
1403         int          midi_request_pipe[2];
1404         RingBuffer<MIDIRequest*> midi_requests;
1405
1406         int           start_midi_thread ();
1407         void          terminate_midi_thread ();
1408         void          poke_midi_thread ();
1409         static void *_midi_thread_work (void *arg);
1410         void          midi_thread_work ();
1411         void          change_midi_ports ();
1412         int           use_config_midi_ports ();
1413
1414         void set_play_loop (bool yn);
1415         void overwrite_some_buffers (Diskstream*);
1416         void flush_all_inserts ();
1417         int  micro_locate (nframes_t distance);
1418         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1419         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1420         void force_locate (nframes_t frame, bool with_roll = false);
1421         void set_diskstream_speed (Diskstream*, double speed);
1422         void set_transport_speed (double speed, bool abort = false);
1423         void stop_transport (bool abort = false);
1424         void start_transport ();
1425         void realtime_stop (bool abort);
1426         void non_realtime_start_scrub ();
1427         void non_realtime_set_speed ();
1428         void non_realtime_locate ();
1429         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1430         void non_realtime_overwrite (int entry_request_count, bool& finished);
1431         void butler_transport_work ();
1432         void post_transport ();
1433         void engine_halted ();
1434         void xrun_recovery ();
1435
1436         TempoMap    *_tempo_map;
1437         void          tempo_map_changed (Change);
1438
1439         /* edit/mix groups */
1440
1441         int load_route_groups (const XMLNode&, bool is_edit);
1442         int load_edit_groups (const XMLNode&);
1443         int load_mix_groups (const XMLNode&);
1444
1445
1446         std::list<RouteGroup *> edit_groups;
1447         std::list<RouteGroup *> mix_groups;
1448
1449         /* disk-streams */
1450
1451         SerializedRCUManager<DiskstreamList>  diskstreams;
1452
1453         uint32_t audio_dstream_buffer_size;
1454         uint32_t midi_dstream_buffer_size;
1455         int load_diskstreams (const XMLNode&);
1456
1457         /* routes stuff */
1458
1459         SerializedRCUManager<RouteList>  routes;
1460
1461         void add_routes (RouteList&, bool save);
1462         uint32_t destructive_index;
1463
1464         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1465
1466         /* mixer stuff */
1467
1468         bool       solo_update_disabled;
1469         bool       currently_soloing;
1470
1471         void route_mute_changed (void *src);
1472         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1473         void catch_up_on_solo ();
1474         void catch_up_on_solo_mute_override ();
1475         void update_route_solo_state ();
1476         void modify_solo_mute (bool, bool);
1477         void strip_portname_for_solo (std::string& portname);
1478
1479         /* REGION MANAGEMENT */
1480
1481         std::map<std::string,uint32_t> region_name_map;
1482         void update_region_name_map (boost::shared_ptr<Region>);
1483
1484         mutable Glib::Mutex region_lock;
1485         typedef std::map<PBD::ID,boost::shared_ptr<Region> > RegionList;
1486         RegionList regions;
1487
1488         void add_region (boost::shared_ptr<Region>);
1489         void region_changed (Change, boost::weak_ptr<Region>);
1490         void remove_region (boost::weak_ptr<Region>);
1491
1492         int load_regions (const XMLNode& node);
1493
1494         /* SOURCES */
1495
1496         mutable Glib::Mutex source_lock;
1497         typedef std::map<PBD::ID,boost::shared_ptr<Source> > SourceMap;
1498
1499         SourceMap sources;
1500
1501   public:
1502         SourceMap get_sources() { return sources; }
1503
1504   private:
1505         int load_sources (const XMLNode& node);
1506         XMLNode& get_sources_as_xml ();
1507
1508         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1509
1510         /* PLAYLISTS */
1511
1512         mutable Glib::Mutex playlist_lock;
1513         typedef std::set<boost::shared_ptr<Playlist> > PlaylistList;
1514         PlaylistList playlists;
1515         PlaylistList unused_playlists;
1516
1517         int load_playlists (const XMLNode&);
1518         int load_unused_playlists (const XMLNode&);
1519         void remove_playlist (boost::weak_ptr<Playlist>);
1520         void track_playlist (bool, boost::weak_ptr<Playlist>);
1521
1522         boost::shared_ptr<Playlist> playlist_factory (std::string name);
1523         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1524
1525         void playlist_length_changed ();
1526         void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
1527
1528         /* NAMED SELECTIONS */
1529
1530         mutable Glib::Mutex named_selection_lock;
1531         typedef std::set<NamedSelection *> NamedSelectionList;
1532         NamedSelectionList named_selections;
1533
1534         int load_named_selections (const XMLNode&);
1535
1536         NamedSelection *named_selection_factory (std::string name);
1537         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1538
1539         /* CURVES and AUTOMATION LISTS */
1540         std::map<PBD::ID, AutomationList*> automation_lists;
1541
1542         /* DEFAULT FADE CURVES */
1543
1544         float default_fade_steepness;
1545         float default_fade_msecs;
1546
1547         /* AUDITIONING */
1548
1549         boost::shared_ptr<Auditioner> auditioner;
1550         void set_audition (boost::shared_ptr<Region>);
1551         void non_realtime_set_audition ();
1552         boost::shared_ptr<Region> pending_audition_region;
1553
1554         /* EXPORT */
1555
1556         /* FLATTEN */
1557
1558         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1559
1560         /* INSERT AND SEND MANAGEMENT */
1561
1562         std::list<PortInsert *>              _port_inserts;
1563         std::list<PluginInsert *>            _plugin_inserts;
1564         std::list<Send *>                    _sends;
1565         std::list<Return *>                  _returns;
1566         boost::dynamic_bitset<uint32_t> send_bitset;
1567         boost::dynamic_bitset<uint32_t> return_bitset;
1568         boost::dynamic_bitset<uint32_t> insert_bitset;
1569         uint32_t                        send_cnt;
1570         uint32_t                        insert_cnt;
1571
1572
1573         void add_processor (Processor *);
1574         void remove_processor (Processor *);
1575
1576         /* S/W RAID */
1577
1578         struct space_and_path {
1579                 uint32_t blocks; /* 4kB blocks */
1580                 std::string path;
1581
1582                 space_and_path() {
1583                         blocks = 0;
1584                 }
1585         };
1586
1587         struct space_and_path_ascending_cmp {
1588                 bool operator() (space_and_path a, space_and_path b) {
1589                         return a.blocks > b.blocks;
1590                 }
1591         };
1592
1593         void setup_raid_path (std::string path);
1594
1595         std::vector<space_and_path> session_dirs;
1596         std::vector<space_and_path>::iterator last_rr_session_dir;
1597         uint32_t _total_free_4k_blocks;
1598         Glib::Mutex space_lock;
1599
1600         std::string get_best_session_directory_for_new_source ();
1601         void refresh_disk_space ();
1602
1603         mutable gint _playback_load;
1604         mutable gint _capture_load;
1605         mutable gint _playback_load_min;
1606         mutable gint _capture_load_min;
1607
1608         /* I/O bundles */
1609
1610         SerializedRCUManager<BundleList> _bundles;
1611         XMLNode* _bundle_xml_node;
1612         int load_bundles (XMLNode const &);
1613
1614         void reverse_diskstream_buffers ();
1615
1616         UndoHistory                  _history;
1617         std::stack<UndoTransaction*> _current_trans;
1618
1619         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1620         GlobalRouteMeterState get_global_route_metering ();
1621
1622         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1623         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1624
1625         void set_global_mute (GlobalRouteBooleanState s, void *src);
1626         void set_global_solo (GlobalRouteBooleanState s, void *src);
1627         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1628
1629         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1630         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1631         void reset_jack_connection (jack_client_t* jack);
1632         void record_enable_change_all (bool yn);
1633
1634         XMLNode& state(bool);
1635
1636         /* click track */
1637
1638         struct Click {
1639                 nframes_t start;
1640                 nframes_t duration;
1641                 nframes_t offset;
1642                 const Sample *data;
1643
1644                 Click (nframes_t s, nframes_t d, const Sample *b)
1645                         : start (s), duration (d), data (b) { offset = 0; }
1646
1647                 void *operator new(size_t ignored) {
1648                         return pool.alloc ();
1649                 };
1650
1651                 void operator delete(void *ptr, size_t size) {
1652                         pool.release (ptr);
1653                 }
1654
1655           private:
1656                 static Pool pool;
1657         };
1658
1659         typedef std::list<Click*> Clicks;
1660
1661         Clicks                 clicks;
1662         bool                  _clicking;
1663         boost::shared_ptr<IO> _click_io;
1664         Sample*                click_data;
1665         Sample*                click_emphasis_data;
1666         nframes_t              click_length;
1667         nframes_t              click_emphasis_length;
1668         mutable Glib::RWLock   click_lock;
1669
1670         static const Sample    default_click[];
1671         static const nframes_t default_click_length;
1672         static const Sample    default_click_emphasis[];
1673         static const nframes_t default_click_emphasis_length;
1674
1675         Click *get_click();
1676         void   setup_click_sounds (int which);
1677         void   clear_clicks ();
1678         void   click (nframes_t start, nframes_t nframes);
1679
1680         std::vector<Route*> master_outs;
1681
1682         /* range playback */
1683
1684         std::list<AudioRange> current_audio_range;
1685         bool _play_range;
1686         void set_play_range (bool yn);
1687         void setup_auto_play ();
1688
1689         /* main outs */
1690         uint32_t main_outs;
1691
1692         boost::shared_ptr<IO> _master_out;
1693         boost::shared_ptr<IO> _control_out;
1694
1695         gain_t* _gain_automation_buffer;
1696         pan_t** _pan_automation_buffer;
1697         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1698         uint32_t _npan_buffers;
1699
1700         /* VST support */
1701
1702         long _vst_callback (VSTPlugin*,
1703                         long opcode,
1704                         long index,
1705                         long value,
1706                         void* ptr,
1707                         float opt);
1708
1709         /* number of hardware ports we're using,
1710            based on max (requested,available)
1711         */
1712
1713         uint32_t n_physical_outputs;
1714         uint32_t n_physical_inputs;
1715
1716         uint32_t n_physical_audio_outputs;
1717         uint32_t n_physical_audio_inputs;
1718
1719         uint32_t n_physical_midi_outputs;
1720         uint32_t n_physical_midi_inputs;
1721
1722         int find_all_sources (std::string path, std::set<std::string>& result);
1723         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1724
1725         LayerModel layer_model;
1726         CrossfadeModel xfade_model;
1727
1728         typedef std::set<boost::shared_ptr<PBD::Controllable> > Controllables;
1729         Glib::Mutex controllables_lock;
1730         Controllables controllables;
1731
1732         void reset_native_file_format();
1733         bool first_file_data_format_reset;
1734         bool first_file_header_format_reset;
1735
1736         void config_changed (const char*);
1737
1738         XMLNode& get_control_protocol_state ();
1739
1740         void set_history_depth (uint32_t depth);
1741         void sync_order_keys ();
1742
1743         static bool _disable_all_loaded_plugins;
1744         
1745         SessionMetadata * _metadata;
1746
1747         mutable bool have_looped; ///< Used in ::audible_frame(*)
1748
1749         void update_have_rec_enabled_diskstream ();
1750         gint _have_rec_enabled_diskstream;
1751 };
1752
1753 } // namespace ARDOUR
1754
1755 #endif /* __ardour_session_h__ */