debug flag for session destruction and waf option for boost SP debug
[ardour.git] / libs / ardour / ardour / session.h
index aa15f07e8d38cab18e01de7763c5bb2287341c65..48a7ce7a399f0a62bcc2757f41d7dec16f326042 100644 (file)
@@ -54,7 +54,7 @@
 #include "ardour/rc_configuration.h"
 #include "ardour/session_configuration.h"
 #include "ardour/location.h"
-#include "ardour/smpte.h"
+#include "ardour/timecode.h"
 #include "ardour/interpolation.h"
 
 class XMLTree;
@@ -86,12 +86,14 @@ class AutomationList;
 class AuxInput;
 class BufferSet;
 class Bundle;
+class Butler;
 class ControlProtocolInfo;
 class Diskstream;
 class ExportHandler;
 class ExportStatus;
 class IO;
 class IOProcessor;
+class ImportStatus;
 class MidiDiskstream;
 class MidiRegion;
 class MidiSource;
@@ -114,7 +116,6 @@ class Slave;
 class Source;
 class TempoMap;
 class VSTPlugin;
-class Butler;
 
 class Session : public PBD::StatefulDestructible, public boost::noncopyable
 {
@@ -131,8 +132,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                Recording = 2
        };
 
-       struct Event {
-               enum Type {
+        struct Event {
+               enum Type {
                        SetTransportSpeed,
                        SetDiskstreamSpeed,
                        Locate,
@@ -144,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 */
@@ -298,19 +303,25 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        bool have_captured() const { return _have_captured; }
 
        void refill_all_diskstream_buffers ();
-       uint32_t audio_diskstream_buffer_size() const { return audio_dstream_buffer_size; }
-       uint32_t midi_diskstream_buffer_size() const { return midi_dstream_buffer_size; }
+       Butler* butler() { return _butler; }
+       void butler_transport_work ();
 
        uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
        uint32_t n_diskstreams() const;
 
+       void refresh_disk_space ();
+
        typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
 
+       SerializedRCUManager<DiskstreamList>& diskstream_list() { return diskstreams; }
+
        int load_routes (const XMLNode&, int);
        boost::shared_ptr<RouteList> get_routes() const {
                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;
@@ -370,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 */
@@ -383,10 +394,10 @@ 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);
+       void request_play_loop (bool yn, bool leave_rolling = false);
        bool get_play_loop () const { return play_loop; }
 
        nframes_t  last_transport_start() const { return _last_roll_location; }
@@ -401,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 ();
@@ -417,15 +428,15 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        nframes_t nominal_frame_rate() const   { return _nominal_frame_rate; }
        nframes_t frames_per_hour() const { return _frames_per_hour; }
 
-       double frames_per_smpte_frame() const { return _frames_per_smpte_frame; }
-       nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; }
+       double frames_per_timecode_frame() const { return _frames_per_timecode_frame; }
+       nframes_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
 
-       MIDI::byte get_mtc_smpte_bits() const {
-               return mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
+       MIDI::byte get_mtc_timecode_bits() const {
+               return mtc_timecode_bits;   /* encoding of SMTPE type for MTC */
        }
 
-       float smpte_frames_per_second() const;
-       bool smpte_drop_frames() const;
+       float timecode_frames_per_second() const;
+       bool timecode_drop_frames() const;
 
        /* Locations */
 
@@ -508,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
@@ -528,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 {
@@ -547,28 +558,29 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void sync_time_vars();
 
        void bbt_time (nframes_t when, BBT_Time&);
-       void smpte_to_sample(SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes) const;
-       void sample_to_smpte(nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes) const;
-       void smpte_time (SMPTE::Time &);
-       void smpte_time (nframes_t when, SMPTE::Time&);
-       void smpte_time_subframes (nframes_t when, SMPTE::Time&);
+       void timecode_to_sample(Timecode::Time& timecode, nframes_t& sample, bool use_offset, bool use_subframes) const;
+       void sample_to_timecode(nframes_t sample, Timecode::Time& timecode, bool use_offset, bool use_subframes) const;
+       void timecode_time (Timecode::Time &);
+       void timecode_time (nframes_t when, Timecode::Time&);
+       void timecode_time_subframes (nframes_t when, Timecode::Time&);
 
-       void smpte_duration (nframes_t, SMPTE::Time&) const;
-       void smpte_duration_string (char *, nframes_t) const;
+       void timecode_duration (nframes_t, Timecode::Time&) const;
+       void timecode_duration_string (char *, nframes_t) const;
 
-       void           set_smpte_offset (nframes_t);
-       nframes_t      smpte_offset () const { return _smpte_offset; }
-       void           set_smpte_offset_negative (bool);
-       bool           smpte_offset_negative () const { return _smpte_offset_negative; }
+       void           set_timecode_offset (nframes_t);
+       nframes_t      timecode_offset () const { return _timecode_offset; }
+       void           set_timecode_offset_negative (bool);
+       bool           timecode_offset_negative () const { return _timecode_offset_negative; }
 
        nframes_t convert_to_frames_at (nframes_t position, AnyTime const &);
 
        static sigc::signal<void> StartTimeChanged;
        static sigc::signal<void> EndTimeChanged;
-       static sigc::signal<void> SMPTEOffsetChanged;
+       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; }
@@ -581,8 +593,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        TempoMap& tempo_map() { return *_tempo_map; }
 
-       /// signals the current transport position in frames, bbt and smpte time (in that order)
-       sigc::signal<void, const nframes_t&, const BBT_Time&, const SMPTE::Time&> tick;
+       /// signals the current transport position in frames, bbt and timecode time (in that order)
+       sigc::signal<void, const nframes_t&, const BBT_Time&, const Timecode::Time&> tick;
 
        /* region info  */
 
@@ -608,20 +620,6 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        /* source management */
 
-       struct ImportStatus : public InterThreadInfo {
-               std::string doing_what;
-
-               /* control info */
-               uint32_t total;
-               SrcQuality quality;
-               volatile bool freeze;
-               std::vector<Glib::ustring> paths;
-               bool replace_existing_source;
-
-               /* result */
-               SourceList sources;
-       };
-
        void import_audiofiles (ImportStatus&);
        bool sample_rate_convert (ImportStatus&, std::string infile, std::string& outfile);
        std::string build_tmp_convert_name (std::string file);
@@ -638,13 +636,10 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void add_source (boost::shared_ptr<Source>);
        void remove_source (boost::weak_ptr<Source>);
 
-       struct cleanup_report {
-               std::vector<std::string> paths;
-               int64_t        space;
-       };
+       uint32_t source_use_count (boost::shared_ptr<const Source> src) const;
 
-       int  cleanup_sources (cleanup_report&);
-       int  cleanup_trash_sources (cleanup_report&);
+       int  cleanup_sources (CleanupReport&);
+       int  cleanup_trash_sources (CleanupReport&);
 
        int destroy_region (boost::shared_ptr<Region>);
        int destroy_regions (std::list<boost::shared_ptr<Region> >);
@@ -924,15 +919,9 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        void reset_playback_load_min ();
        void reset_capture_load_min ();
 
-       float read_data_rate () const; // in usec
-       float write_data_rate () const;
-
        /* ranges */
 
-       void set_audio_range (std::list<AudioRange>&);
-       void set_music_range (std::list<MusicRange>&);
-
-       void request_play_range (bool yn);
+       void request_play_range (std::list<AudioRange>*, bool leave_rolling = false);
        bool get_play_range () const { return _play_range; }
 
        /* buffers for gain and pan */
@@ -975,8 +964,6 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
   protected:
        friend class Diskstream;
-       void stop_butler ();
-       void wait_till_butler_finished();
 
   protected:
        friend class Route;
@@ -1014,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;
@@ -1027,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;
@@ -1043,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 *) {
@@ -1089,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;
@@ -1134,15 +1123,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                }
        }
 
-       bool maybe_stop (nframes_t limit) {
-               if ( (_transport_speed > 0.0f && _transport_frame >= limit)
-                               || (_transport_speed < 0.0f && _transport_frame == 0) ) {
-                       stop_transport ();
-                       return true;
-               }
-               return false;
-       }
-
+       bool maybe_stop (nframes_t limit);
        bool maybe_sync_start (nframes_t&);
 
        void check_declick_out ();
@@ -1188,18 +1169,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        bool              pending_abort;
        bool              pending_auto_loop;
 
-       Butler* butler;
-
-       bool transport_work_requested() const;
-
-       struct ButlerRequest {
-               enum Type {
-                       Wake,
-                       Run,
-                       Pause,
-                       Quit
-               };
-       };
+       Butler* _butler;
 
        enum PostTransportWork {
                PostTransportStop               = 0x1,
@@ -1216,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 =
@@ -1228,16 +1199,13 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
                                PostTransportScrub|
                                PostTransportAudition|
                                PostTransportLocate|
-                               PostTransportStop);
+                               PostTransportStop|
+                               PostTransportClearSubstate);
 
-       PostTransportWork post_transport_work;
-
-       void             summon_butler ();
-       void             schedule_butler_transport_work ();
-       int              start_butler_thread ();
-       void             terminate_butler_thread ();
-       static void    *_butler_thread_work (void *arg);
-       void*            butler_thread_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;
@@ -1350,25 +1318,25 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        MIDI::byte mmc_buffer[32];
        MIDI::byte mtc_msg[16];
-       MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
+       MIDI::byte mtc_timecode_bits;   /* encoding of SMTPE type for MTC */
        MIDI::byte midi_msg[16];
-       nframes_t  outbound_mtc_smpte_frame;
-       SMPTE::Time transmitting_smpte_time;
+       nframes_t  outbound_mtc_timecode_frame;
+       Timecode::Time transmitting_timecode_time;
        int next_quarter_frame_to_send;
 
-       double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
+       double _frames_per_timecode_frame; /* has to be floating point because of drop frame */
        nframes_t _frames_per_hour;
-       nframes_t _smpte_frames_per_hour;
-       nframes_t _smpte_offset;
-       bool _smpte_offset_negative;
+       nframes_t _timecode_frames_per_hour;
+       nframes_t _timecode_offset;
+       bool _timecode_offset_negative;
 
        /* cache the most-recently requested time conversions. This helps when we
         * have multiple clocks showing the same time (e.g. the transport frame) */
-       bool           last_smpte_valid;
-       nframes_t last_smpte_when;
-       SMPTE::Time    last_smpte;
+       bool           last_timecode_valid;
+       nframes_t last_timecode_when;
+       Timecode::Time    last_timecode;
 
-       bool _send_smpte_update; ///< Flag to send a full frame (SMPTE) MTC message this cycle
+       bool _send_timecode_update; ///< Flag to send a full frame (Timecode) MTC message this cycle
 
        int send_full_time_code(nframes_t nframes);
        int send_midi_time_code_for_cycle(nframes_t nframes);
@@ -1380,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 {
@@ -1405,23 +1373,23 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        int           use_config_midi_ports ();
 
        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 ();
        void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
        void non_realtime_overwrite (int entry_request_count, bool& finished);
-       void butler_transport_work ();
        void post_transport ();
        void engine_halted ();
        void xrun_recovery ();
@@ -1439,8 +1407,6 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
 
        SerializedRCUManager<DiskstreamList>  diskstreams;
 
-       uint32_t audio_dstream_buffer_size;
-       uint32_t midi_dstream_buffer_size;
        int load_diskstreams (const XMLNode&);
 
        /* routes stuff */
@@ -1513,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 */
 
@@ -1581,7 +1547,6 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
        Glib::Mutex space_lock;
 
        std::string get_best_session_directory_for_new_source ();
-       void refresh_disk_space ();
 
        mutable gint _playback_load;
        mutable gint _capture_load;
@@ -1666,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);
-       void setup_auto_play ();
+       void set_play_range (std::list<AudioRange>&, bool leave_rolling);
+       void unset_play_range ();
 
        /* main outs */
        uint32_t main_outs;