initial support for archiving sessions
[ardour.git] / libs / ardour / ardour / session.h
index 61c575e0b22fa85b1533840a3decb837dcd95653..93e3703665b11f22515d5c217124344eff8eeb0d 100644 (file)
@@ -134,6 +134,7 @@ class PluginInfo;
 class Port;
 class PortInsert;
 class ProcessThread;
+class Progress;
 class Processor;
 class Region;
 class Return;
@@ -169,6 +170,16 @@ private:
 /** Ardour Session */
 class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionList, public SessionEventManager
 {
+  private:
+       enum SubState {
+               PendingDeclickIn      = 0x1,  ///< pending de-click fade-in for start
+               PendingDeclickOut     = 0x2,  ///< pending de-click fade-out for stop
+               StopPendingCapture    = 0x4,
+               PendingLoopDeclickIn  = 0x8,  ///< pending de-click fade-in at the start of a loop
+               PendingLoopDeclickOut = 0x10, ///< pending de-click fade-out at the end of a loop
+               PendingLocate         = 0x20,
+       };
+
   public:
        enum RecordState {
                Disabled = 0,
@@ -245,8 +256,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
         * @param pd Playlist disposition
         * @return list of newly created routes
         */
-       RouteList new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
-       RouteList new_route_from_template (uint32_t how_many, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
+       RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
+       RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
        std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
 
        int bring_all_sources_into_session (boost::function<void(uint32_t,uint32_t,std::string)> callback);
@@ -302,10 +313,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        };
 
        void notify_presentation_info_change ();
-       void clear_stripable_selection ();
-       void toggle_stripable_selection (boost::shared_ptr<Stripable>);
-       void add_stripable_selection (boost::shared_ptr<Stripable>);
-       void set_stripable_selection (boost::shared_ptr<Stripable>);
 
        template<class T> void foreach_route (T *obj, void (T::*func)(Route&), bool sort = true);
        template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>), bool sort = true);
@@ -430,6 +437,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        void request_input_change_handling ();
 
        bool locate_pending() const { return static_cast<bool>(post_transport_work()&PostTransportLocate); }
+       bool declick_out_pending() const { return static_cast<bool>(transport_sub_state&(PendingDeclickOut)); }
        bool transport_locked () const;
 
        int wipe ();
@@ -463,6 +471,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        void set_auto_punch_location (Location *);
        void set_auto_loop_location (Location *);
        void set_session_extents (framepos_t start, framepos_t end);
+       void set_end_is_free (bool);
        int location_name(std::string& result, std::string base = std::string(""));
 
        pframes_t get_block_size()        const { return current_block_size; }
@@ -508,6 +517,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
         * @return zero on success
         */
        int save_state (std::string snapshot_name, bool pending = false, bool switch_to_snapshot = false, bool template_only = false);
+
+       int archive_session (const std::string&, const std::string&, Progress* p = 0);
+
        int restore_state (std::string snapshot_name);
        int save_template (std::string template_name, bool replace_existing = false);
        int save_history (std::string snapshot_name = "");
@@ -707,7 +719,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        boost::shared_ptr<ExportHandler> get_export_handler ();
        boost::shared_ptr<ExportStatus> get_export_status ();
 
-       int start_audio_export (framepos_t position);
+       int start_audio_export (framepos_t position, bool realtime = false);
 
        PBD::Signal1<int, framecnt_t> ProcessExport;
        static PBD::Signal2<void,std::string, std::string> Exported;
@@ -794,6 +806,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        bool soloing() const { return _non_soloed_outs_muted; }
        bool listening() const { return _listen_cnt > 0; }
        bool solo_isolated() const { return _solo_isolated_cnt > 0; }
+       void cancel_all_solo ();
 
        static const SessionEvent::RTeventCallback rt_cleanup;
 
@@ -822,8 +835,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
        boost::shared_ptr<Route> monitor_out() const { return _monitor_out; }
        boost::shared_ptr<Route> master_out() const { return _master_out; }
-       boost::weak_ptr<Route> get_editor_mixer() const { return _editor_mixer; }
-       void set_editor_mixer (boost::weak_ptr<Route> r) { _editor_mixer = r; }
 
        void globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool);
        void globally_set_send_gains_from_track (boost::shared_ptr<Route> dest);
@@ -878,13 +889,11 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        /** Undo some transactions.
         * @param n Number of transactions to undo.
         */
-       void undo (uint32_t n) {
-               _history.undo (n);
-       }
-
-       void redo (uint32_t n) {
-               _history.redo (n);
-       }
+       void undo (uint32_t n);
+       /** Redo some transactions.
+        * @param n Number of transactions to undo.
+        */
+       void redo (uint32_t n);
 
        UndoHistory& history() { return _history; }
 
@@ -1011,6 +1020,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
        SessionConfiguration config;
 
+       SessionConfiguration* cfg () { return &config; }
+
        bool exporting () const {
                return _exporting;
        }
@@ -1132,6 +1143,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
        VCAManager& vca_manager() { return *_vca_manager; }
 
+       bool midi_regions_use_bbt_beats () { return _midi_regions_use_bbt_beats; }
+
   protected:
        friend class AudioEngine;
        void set_block_size (pframes_t nframes);
@@ -1153,15 +1166,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        static void init_name_id_counter (guint n);
        static unsigned int name_id_counter ();
 
-       enum SubState {
-               PendingDeclickIn      = 0x1,  ///< pending de-click fade-in for start
-               PendingDeclickOut     = 0x2,  ///< pending de-click fade-out for stop
-               StopPendingCapture    = 0x4,
-               PendingLoopDeclickIn  = 0x8,  ///< pending de-click fade-in at the start of a loop
-               PendingLoopDeclickOut = 0x10, ///< pending de-click fade-out at the end of a loop
-               PendingLocate         = 0x20,
-       };
-
        /* stuff used in process() should be close together to
           maximise cache hits
        */
@@ -1181,6 +1185,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        mutable gint            _record_status;
        framepos_t              _transport_frame;
        Location*               _session_range_location; ///< session range, or 0 if there is nothing in the session yet
+       bool                    _session_range_end_is_free;
        Slave*                  _slave;
        bool                    _silent;
 
@@ -1233,8 +1238,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        void process_without_events (pframes_t);
        void process_with_events    (pframes_t);
        void process_audition       (pframes_t);
-       int  process_export         (pframes_t);
-       int  process_export_fw      (pframes_t);
+       void process_export         (pframes_t);
+       void process_export_fw      (pframes_t);
 
        void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
        void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
@@ -1271,7 +1276,9 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
        bool _exporting;
        bool _export_rolling;
+       bool _realtime_export;
        framepos_t _export_preroll;
+       framepos_t _export_latency;
 
        boost::shared_ptr<ExportHandler> export_handler;
        boost::shared_ptr<ExportStatus>  export_status;
@@ -1515,8 +1522,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        typedef std::queue<AutoConnectRequest> AutoConnectQueue;
        Glib::Threads::Mutex  _auto_connect_queue_lock;
        AutoConnectQueue _auto_connect_queue;
+       guint _latency_recompute_pending;
 
        void auto_connect (const AutoConnectRequest&);
+       void queue_latency_recompute ();
 
        /* SessionEventManager interface */
 
@@ -1873,7 +1882,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
 
        boost::shared_ptr<Route> _master_out;
        boost::shared_ptr<Route> _monitor_out;
-       boost::weak_ptr<Route> _editor_mixer;
 
        void auto_connect_master_bus ();
 
@@ -2016,6 +2024,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
        boost::shared_ptr<Route> get_midi_nth_route_by_id (PresentationInfo::order_t n) const;
 
        std::string created_with;
+
+       bool _midi_regions_use_bbt_beats;
 };