debug flag for session destruction and waf option for boost SP debug
[ardour.git] / libs / ardour / ardour / session.h
index 3a980982c38eccaac1188a6b28b8b588b78ae888..48a7ce7a399f0a62bcc2757f41d7dec16f326042 100644 (file)
@@ -132,8 +132,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                Recording = 2
        };
 
-       struct Event {
-               enum Type {
+        struct Event {
+               enum Type {
                        SetTransportSpeed,
                        SetDiskstreamSpeed,
                        Locate,
@@ -145,81 +145,85 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                        RangeStop,
                        RangeLocate,
                        Overwrite,
-                       SetSlaveSource,
+                       SetSyncSource,
                        Audition,
                        InputConfigurationChange,
-                       SetAudioRange,
-                       SetPlayRange,
-
+                       SetPlayAudioRange,
+                       
                        /* only one of each of these events can be queued at any one time */
-
+                       
                        StopOnce,
                        AutoLoop
                };
-
-               enum Action {
-                       Add,
-                       Remove,
-                       Replace,
-                       Clear
-               };
-
-               Type             type;
-               Action           action;
-               nframes_t        action_frame;
-               nframes_t        target_frame;
-               double           speed;
-
-               union {
-                       void*        ptr;
-                       bool         yes_or_no;
-                       nframes_t    target2_frame;
-                       SlaveSource  slave;
-                       Route*       route;
-               };
-
-               std::list<AudioRange> audio_range;
-               std::list<MusicRange> music_range;
-
-               boost::shared_ptr<Region> region;
-
-               Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false)
+           
+                enum Action {
+                        Add,
+                        Remove,
+                        Replace,
+                        Clear
+                };
+           
+           Type             type;
+           Action           action;
+           nframes64_t      action_frame;
+           nframes64_t      target_frame;
+           double           speed;
+           
+           union {
+               void*        ptr;
+               bool         yes_or_no;
+               nframes64_t  target2_frame;
+               SyncSource   sync_source;
+               Route*       route;
+           };
+
+           union {
+               bool second_yes_or_no;
+           };
+           
+           std::list<AudioRange> audio_range;
+           std::list<MusicRange> music_range;
+           
+           boost::shared_ptr<Region> region;
+           
+           Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false, bool yn2 = false)
                        : type (t)
                        , action (a)
                        , action_frame (when)
                        , target_frame (where)
                        , speed (spd)
                        , yes_or_no (yn)
+                       , second_yes_or_no (yn2)
                {}
 
-               void set_ptr (void* p) {
-                       ptr = p;
-               }
-
-               bool before (const Event& other) const {
-                       return action_frame < other.action_frame;
-               }
-
-               bool after (const Event& other) const {
-                       return action_frame > other.action_frame;
-               }
-
-               static bool compare (const Event *e1, const Event *e2) {
-                       return e1->before (*e2);
-               }
-
-               void *operator new (size_t) {
-                       return pool.alloc ();
-               }
-
-               void operator delete (void *ptr, size_t /*size*/) {
-                       pool.release (ptr);
-               }
-
-               static const nframes_t Immediate = 0;
-
-               private:
-               static MultiAllocSingleReleasePool pool;
+           void set_ptr (void* p) {
+                   ptr = p;
+           }
+           
+           bool before (const Event& other) const {
+                   return action_frame < other.action_frame;
+           }
+           
+           bool after (const Event& other) const {
+                   return action_frame > other.action_frame;
+           }
+           
+           static bool compare (const Event *e1, const Event *e2) {
+                   return e1->before (*e2);
+           }
+           
+           void *operator new (size_t) {
+                   return pool.alloc ();
+           }
+           
+           void operator delete (void *ptr, size_t /*size*/) {
+                   pool.release (ptr);
+           }
+           
+           static const nframes_t Immediate = 0;
+           
+       private:
+           static MultiAllocSingleReleasePool pool;
        };
 
        /* creating from an XML file */
@@ -316,6 +320,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                return routes.reader ();
        }
 
+       boost::shared_ptr<RouteList> get_routes_with_internal_returns() const;
+
        uint32_t nroutes() const { return routes.reader()->size(); }
        uint32_t ntracks () const;
        uint32_t nbusses () const;
@@ -375,9 +381,9 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        /* Transport mechanism signals */
 
        sigc::signal<void> TransportStateChange; /* generic */
-       sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */
+       sigc::signal<void,nframes64_t> PositionChanged; /* sent after any non-sequential motion */
        sigc::signal<void> DurationChanged;
-       sigc::signal<void,nframes_t> Xrun;
+       sigc::signal<void,nframes64_t> Xrun;
        sigc::signal<void> TransportLooped;
 
        /** emitted when a locate has occurred */
@@ -388,7 +394,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        void request_roll_at_and_return (nframes_t start, nframes_t return_to);
        void request_bounded_roll (nframes_t start, nframes_t end);
-       void request_stop (bool abort = false);
+       void request_stop (bool abort = false, bool clear_state = false);
        void request_locate (nframes_t frame, bool with_roll = false);
 
        void request_play_loop (bool yn, bool leave_rolling = false);
@@ -406,7 +412,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void request_diskstream_speed (Diskstream&, double speed);
        void request_input_change_handling ();
 
-       bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
+       bool locate_pending() const { return static_cast<bool>(post_transport_work()&PostTransportLocate); }
        bool transport_locked () const;
 
        int wipe ();
@@ -513,7 +519,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                int input_channels, int output_channels, TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1
                );
 
-       RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many);
+       RouteList new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many);
 
        std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
                TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1
@@ -533,8 +539,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        /* Time */
 
-       nframes_t transport_frame () const {return _transport_frame; }
-       nframes_t audible_frame () const;
+        nframes64_t transport_frame () const {return _transport_frame; }
+       nframes64_t audible_frame () const;
        nframes64_t requested_return_frame() const { return _requested_return_frame; }
 
        enum PullupFormat {
@@ -572,8 +578,9 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        static sigc::signal<void> EndTimeChanged;
        static sigc::signal<void> TimecodeOffsetChanged;
 
-       void   request_slave_source (SlaveSource);
-       bool   synced_to_jack() const { return Config->get_slave_source() == JACK; }
+        std::vector<SyncSource> get_available_sync_options() const;
+       void   request_sync_source (SyncSource);
+        bool   synced_to_jack() const { return config.get_external_sync() && config.get_sync_source() == JACK; }
 
        double transport_speed() const { return _transport_speed; }
        bool   transport_stopped() const { return _transport_speed == 0.0f; }
@@ -914,10 +921,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        /* ranges */
 
-       void set_audio_range (std::list<AudioRange>&);
-       void set_music_range (std::list<MusicRange>&);
-
-       void request_play_range (bool yn, bool leave_rolling = false);
+       void request_play_range (std::list<AudioRange>*, bool leave_rolling = false);
        bool get_play_range () const { return _play_range; }
 
        /* buffers for gain and pan */
@@ -997,7 +1001,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        nframes_t               _nominal_frame_rate;  //ignores audioengine setting, "native" SR
        int                      transport_sub_state;
        mutable gint            _record_status;
-       volatile nframes_t      _transport_frame;
+       volatile nframes64_t    _transport_frame;
        Location*                end_location;
        Location*                start_location;
        Slave*                  _slave;
@@ -1010,7 +1014,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        CubicInterpolation          interpolation;
 
        bool                     auto_play_legal;
-       nframes_t               _last_slave_transport_frame;
+       nframes64_t             _last_slave_transport_frame;
        nframes_t                maximum_output_latency;
        volatile nframes64_t    _requested_return_frame;
        BufferSet*              _scratch_buffers;
@@ -1026,6 +1030,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        bool                    _non_soloed_outs_muted;
        uint32_t                _listen_cnt;
        bool                    _writable;
+       bool                    _was_seamless;
 
        void set_worst_io_latencies ();
        void set_worst_io_latencies_x (IOChange, void *) {
@@ -1072,9 +1077,10 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                               nframes_t this_delta, bool starting);
        void follow_slave_silently(nframes_t nframes, float slave_speed);
 
-       void set_slave_source (SlaveSource);
+        void use_sync_source (SyncSource);
+        void drop_sync_source ();
 
-       SlaveSource post_export_slave;
+        bool post_export_sync;
        nframes_t post_export_position;
 
        bool _exporting;
@@ -1180,7 +1186,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                PostTransportScrub              = 0x8000,
                PostTransportReverse            = 0x10000,
                PostTransportInputChange        = 0x20000,
-               PostTransportCurveRealloc       = 0x40000
+               PostTransportCurveRealloc       = 0x40000,
+               PostTransportClearSubstate      = 0x80000
        };
 
        static const PostTransportWork ProcessCannotProceedMask =
@@ -1192,9 +1199,13 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                                PostTransportScrub|
                                PostTransportAudition|
                                PostTransportLocate|
-                               PostTransportStop);
+                               PostTransportStop|
+                               PostTransportClearSubstate);
 
-       PostTransportWork post_transport_work;
+       gint _post_transport_work; /* accessed only atomic ops */
+       PostTransportWork post_transport_work() const        { return (PostTransportWork) g_atomic_int_get (&_post_transport_work); }
+       void set_post_transport_work (PostTransportWork ptw) { g_atomic_int_set (&_post_transport_work, (gint) ptw); }
+       void add_post_transport_work (PostTransportWork ptw);
 
        uint32_t    cumulative_rf_motion;
        uint32_t    rf_scale;
@@ -1337,8 +1348,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        int no_roll (nframes_t nframes);
        int fail_roll (nframes_t nframes);
 
-       bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
-       bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
+       bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work()); }
+       bool process_can_proceed() const { return !(post_transport_work() & ProcessCannotProceedMask); }
 
        struct MIDIRequest {
                enum Type {
@@ -1361,18 +1372,19 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void          change_midi_ports ();
        int           use_config_midi_ports ();
 
-       void set_play_loop (bool yn, bool leave_rolling);
+       void set_play_loop (bool yn);
+       void unset_play_loop ();
        void overwrite_some_buffers (Diskstream*);
        void flush_all_inserts ();
        int  micro_locate (nframes_t distance);
-       void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
-       void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
-       void force_locate (nframes_t frame, bool with_roll = false);
+        void locate (nframes64_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false);
+        void start_locate (nframes64_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false);
+       void force_locate (nframes64_t frame, bool with_roll = false);
        void set_diskstream_speed (Diskstream*, double speed);
-       void set_transport_speed (double speed, bool abort = false);
-       void stop_transport (bool abort = false);
+        void set_transport_speed (double speed, bool abort = false, bool clear_state = false);
+       void stop_transport (bool abort = false, bool clear_state = false);
        void start_transport ();
-       void realtime_stop (bool abort);
+       void realtime_stop (bool abort, bool clear_state);
        void non_realtime_start_scrub ();
        void non_realtime_set_speed ();
        void non_realtime_locate ();
@@ -1467,7 +1479,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
 
        void playlist_length_changed ();
-       void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
+       void diskstream_playlist_changed (boost::weak_ptr<Diskstream>);
 
        /* NAMED SELECTIONS */
 
@@ -1619,8 +1631,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        std::list<AudioRange> current_audio_range;
        bool _play_range;
-       void set_play_range (bool yn, bool leave_rolling);
-       void setup_auto_play ();
+       void set_play_range (std::list<AudioRange>&, bool leave_rolling);
+       void unset_play_range ();
 
        /* main outs */
        uint32_t main_outs;