X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsession.h;h=0e543462aef36b4b1992e351e1fb85ef28a0e6ad;hb=a6b735abdbcfc375db314e7f3a4ffb9cee503a48;hp=8de0e1c5234bff25163f3eada812aac2ff383227;hpb=92243228bef1edb3e53685ba018bee7aa9b318fd;p=ardour.git diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 8de0e1c523..0e543462ae 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -31,28 +31,31 @@ #include #include #include +#include #include #include -#include -#include -#include -#include -#include +#include "pbd/error.h" +#include "pbd/pool.h" +#include "pbd/rcu.h" +#include "pbd/statefuldestructible.h" +#include "pbd/undo.h" -#include -#include +#include "midi++/mmc.h" +#include "midi++/types.h" -#include -#include +#include "pbd/destructible.h" +#include "pbd/stateful.h" -#include -#include -#include -#include -#include +#include "ardour/ardour.h" +#include "ardour/chan_count.h" +#include "ardour/rc_configuration.h" +#include "ardour/session_configuration.h" +#include "ardour/location.h" +#include "ardour/smpte.h" +#include "ardour/interpolation.h" class XMLTree; class XMLNode; @@ -100,6 +103,7 @@ class Port; class PortInsert; class Processor; class Region; +class Return; class Route; class RouteGroup; class SMFSource; @@ -111,18 +115,13 @@ class Source; class TempoMap; class VSTPlugin; -using std::vector; -using std::string; -using std::map; -using std::set; - -class Session : public PBD::StatefulDestructible +class Session : public PBD::StatefulDestructible, public boost::noncopyable { private: typedef std::pair,bool> RouteBooleanState; - typedef vector GlobalRouteBooleanState; + typedef std::vector GlobalRouteBooleanState; typedef std::pair,MeterPoint> RouteMeterState; - typedef vector GlobalRouteMeterState; + typedef std::vector GlobalRouteMeterState; public: enum RecordState { @@ -150,9 +149,7 @@ class Session : public PBD::StatefulDestructible SetAudioRange, SetPlayRange, - /* only one of each of these events - can be queued at any one time - */ + /* only one of each of these events can be queued at any one time */ StopOnce, AutoLoop @@ -165,32 +162,33 @@ class Session : public PBD::StatefulDestructible Clear }; - Type type; - Action action; - nframes_t action_frame; - nframes_t target_frame; - double speed; + 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; + void* ptr; + bool yes_or_no; + nframes_t target2_frame; + SlaveSource slave; + Route* route; }; - boost::shared_ptr region; + std::list audio_range; + std::list music_range; - list audio_range; - list music_range; + boost::shared_ptr region; Event(Type t, Action a, nframes_t when, nframes_t where, double spd, bool yn = false) - : type (t), - action (a), - action_frame (when), - target_frame (where), - speed (spd), - yes_or_no (yn) {} + : type (t) + , action (a) + , action_frame (when) + , target_frame (where) + , speed (spd) + , yes_or_no (yn) + {} void set_ptr (void* p) { ptr = p; @@ -208,11 +206,11 @@ class Session : public PBD::StatefulDestructible return e1->before (*e2); } - void *operator new (size_t ignored) { + void *operator new (size_t) { return pool.alloc (); } - void operator delete(void *ptr, size_t size) { + void operator delete (void *ptr, size_t /*size*/) { pool.release (ptr); } @@ -225,15 +223,15 @@ class Session : public PBD::StatefulDestructible /* creating from an XML file */ Session (AudioEngine&, - const string& fullpath, - const string& snapshot_name, - string mix_template = ""); + const std::string& fullpath, + const std::string& snapshot_name, + std::string mix_template = ""); /* creating a new Session */ Session (AudioEngine&, - string fullpath, - string snapshot_name, + std::string fullpath, + std::string snapshot_name, AutoConnectOption input_auto_connect, AutoConnectOption output_auto_connect, uint32_t control_out_channels, @@ -244,17 +242,19 @@ class Session : public PBD::StatefulDestructible virtual ~Session (); - string path() const { return _path; } - string name() const { return _name; } - string snap_name() const { return _current_snapshot_name; } - string raid_path () const; + std::string path() const { return _path; } + std::string name() const { return _name; } + std::string snap_name() const { return _current_snapshot_name; } + std::string raid_path () const; void set_snap_name (); + bool writable() const { return _writable; } void set_dirty (); void set_clean (); bool dirty() const { return _state_of_the_state & Dirty; } void set_deletion_in_progress (); + void clear_deletion_in_progress (); bool deletion_in_progress() const { return _state_of_the_state & Deletion; } sigc::signal DirtyChanged; @@ -275,12 +275,13 @@ class Session : public PBD::StatefulDestructible Glib::ustring peak_path (Glib::ustring) const; - static string change_audio_path_by_name (string oldpath, string oldname, string newname, bool destructive); - static string change_midi_path_by_name (string oldpath, string oldname, string newname, bool destructive); + static std::string change_source_path_by_name (std::string oldpath, std::string oldname, std::string newname, bool destructive); - string peak_path_from_audio_path (string) const; - string audio_path_from_name (string, uint32_t nchans, uint32_t chan, bool destructive); - string midi_path_from_name (string); + std::string peak_path_from_audio_path (std::string) const; + std::string new_audio_source_name (const std::string&, uint32_t nchans, uint32_t chan, bool destructive); + std::string new_midi_source_name (const std::string&); + std::string new_source_path_from_name (DataType type, const std::string&); + RouteList new_route_from_template (uint32_t how_many, const std::string& template_path); void process (nframes_t nframes); @@ -290,7 +291,8 @@ class Session : public PBD::StatefulDestructible void add_diskstream (boost::shared_ptr); boost::shared_ptr diskstream_by_id (const PBD::ID& id); - boost::shared_ptr diskstream_by_name (string name); + boost::shared_ptr diskstream_by_name (std::string name); + bool have_rec_enabled_diskstream () const; bool have_captured() const { return _have_captured; } @@ -303,7 +305,7 @@ class Session : public PBD::StatefulDestructible typedef std::list > DiskstreamList; - int load_routes (const XMLNode&); + int load_routes (const XMLNode&, int); boost::shared_ptr get_routes() const { return routes.reader (); } @@ -317,20 +319,21 @@ class Session : public PBD::StatefulDestructible } struct RoutePublicOrderSorter { - bool operator() (boost::shared_ptr, boost::shared_ptr b); + bool operator() (boost::shared_ptr, boost::shared_ptr b); }; - - void sync_order_keys (const char* base); + + void sync_order_keys (std::string const &); template void foreach_route (T *obj, void (T::*func)(Route&)); template void foreach_route (T *obj, void (T::*func)(boost::shared_ptr)); template void foreach_route (T *obj, void (T::*func)(Route&, A), A arg); - boost::shared_ptr route_by_name (string); + boost::shared_ptr route_by_name (std::string); boost::shared_ptr route_by_id (PBD::ID); boost::shared_ptr route_by_remote_id (uint32_t id); - bool route_name_unique (string) const; + bool route_name_unique (std::string) const; + bool route_name_internal (std::string) const; bool get_record_enabled() const { return (record_status () >= Enabled); @@ -371,7 +374,11 @@ class Session : public PBD::StatefulDestructible sigc::signal Xrun; sigc::signal TransportLooped; + /** emitted when a locate has occurred */ + sigc::signal Located; + sigc::signal RouteAdded; + sigc::signal RouteGroupChanged; void request_roll_at_and_return (nframes_t start, nframes_t return_to); void request_bounded_roll (nframes_t start, nframes_t end); @@ -385,7 +392,7 @@ class Session : public PBD::StatefulDestructible void goto_end () { request_locate (end_location->start(), false);} void goto_start () { request_locate (start_location->start(), false); } void set_session_start (nframes_t start) { start_location->set_start(start); } - void set_session_end (nframes_t end) { end_location->set_start(end); _end_location_is_free = false; } + void set_session_end (nframes_t end) { end_location->set_start(end); config.set_end_marker_is_free (false); } void use_rf_shuttle_speed (); void allow_auto_play (bool yn); void request_transport_speed (double speed); @@ -397,23 +404,22 @@ class Session : public PBD::StatefulDestructible bool transport_locked () const; int wipe (); - //int wipe_diskstream (AudioDiskstream *); int remove_region_from_region_list (boost::shared_ptr); nframes_t get_maximum_extent () const; nframes_t current_end_frame() const { return end_location->start(); } nframes_t current_start_frame() const { return start_location->start(); } - // "actual" sample rate of session, set by current audioengine rate, pullup/down etc. + /// "actual" sample rate of session, set by current audioengine rate, pullup/down etc. nframes_t frame_rate() const { return _current_frame_rate; } - // "native" sample rate of session, regardless of current audioengine rate, pullup/down etc + /// "native" sample rate of session, regardless of current audioengine rate, pullup/down etc 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; } - MIDI::byte get_mtc_smpte_bits() const { + MIDI::byte get_mtc_smpte_bits() const { return mtc_smpte_bits; /* encoding of SMTPE type for MTC */ } @@ -430,7 +436,7 @@ class Session : public PBD::StatefulDestructible void set_auto_punch_location (Location *); void set_auto_loop_location (Location *); - int location_name(string& result, string base = string("")); + int location_name(std::string& result, std::string base = std::string("")); void reset_input_monitor_state (); @@ -438,10 +444,10 @@ class Session : public PBD::StatefulDestructible void remove_event (nframes_t frame, Event::Type type); void clear_events (Event::Type type); - nframes_t get_block_size() const { return current_block_size; } + nframes_t get_block_size() const { return current_block_size; } nframes_t worst_output_latency () const { return _worst_output_latency; } - nframes_t worst_input_latency () const { return _worst_input_latency; } - nframes_t worst_track_latency () const { return _worst_track_latency; } + nframes_t worst_input_latency () const { return _worst_input_latency; } + nframes_t worst_track_latency () const { return _worst_track_latency; } int save_state (std::string snapshot_name, bool pending = false); int restore_state (std::string snapshot_name); @@ -455,19 +461,19 @@ class Session : public PBD::StatefulDestructible static int rename_template (std::string old_name, std::string new_name); static int delete_template (std::string name); - sigc::signal StateSaved; + sigc::signal StateSaved; sigc::signal StateReady; - vector* possible_states() const; - static vector* possible_states(string path); + std::vector* possible_states() const; + static std::vector* possible_states (std::string path); XMLNode& get_state(); - int set_state(const XMLNode& node); // not idempotent + int set_state(const XMLNode& node, int version); // not idempotent XMLNode& get_template(); /// The instant xml file is written to the session directory void add_instant_xml (XMLNode&, bool write_to_config = true); - XMLNode * instant_xml (const std::string& str); + XMLNode* instant_xml (const std::string& str); enum StateOfTheState { Clean = 0x0, @@ -481,39 +487,31 @@ class Session : public PBD::StatefulDestructible StateOfTheState state_of_the_state() const { return _state_of_the_state; } - RouteGroup* add_edit_group (string); - RouteGroup* add_mix_group (string); + void add_route_group (RouteGroup *); + void remove_route_group (RouteGroup&); - void remove_edit_group (RouteGroup&); - void remove_mix_group (RouteGroup&); + RouteGroup *route_group_by_name (std::string); - RouteGroup *mix_group_by_name (string); - RouteGroup *edit_group_by_name (string); + sigc::signal route_group_added; + sigc::signal route_group_removed; - sigc::signal edit_group_added; - sigc::signal mix_group_added; - sigc::signal edit_group_removed; - sigc::signal mix_group_removed; - - void foreach_edit_group (sigc::slot sl) { - for (list::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) { - sl (*i); - } - } - - void foreach_mix_group (sigc::slot sl) { - for (list::iterator i = mix_groups.begin(); i != mix_groups.end(); i++) { + void foreach_route_group (sigc::slot sl) { + for (std::list::iterator i = _route_groups.begin(); i != _route_groups.end(); i++) { sl (*i); } } /* fundamental operations. duh. */ - std::list > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1); - RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many); + std::list > new_audio_track ( + 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); - std::list > new_midi_track (TrackMode mode = Normal, uint32_t how_many = 1); - //boost::shared_ptr new_midi_route (uint32_t how_many = 1); + std::list > new_midi_track ( + TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1 + ); void remove_route (boost::shared_ptr); void resort_routes (); @@ -545,12 +543,11 @@ class Session : public PBD::StatefulDestructible pullup_Minus4Minus1 }; - int set_smpte_format (SmpteFormat); 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_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&); @@ -585,7 +582,7 @@ class Session : public PBD::StatefulDestructible /// signals the current transport position in frames, bbt and smpte time (in that order) sigc::signal tick; - + /* region info */ void add_regions (std::vector >&); @@ -594,9 +591,9 @@ class Session : public PBD::StatefulDestructible sigc::signal >& > RegionsAdded; sigc::signal > RegionRemoved; - int region_name (string& result, string base = string(""), bool newlevel = false); - string new_region_name (string); - string path_from_region_name (DataType type, string name, string identifier); + int region_name (std::string& result, std::string base = std::string(""), bool newlevel = false); + std::string new_region_name (std::string); + std::string path_from_region_name (DataType type, std::string name, std::string identifier); boost::shared_ptr find_whole_file_parent (boost::shared_ptr); @@ -610,8 +607,8 @@ class Session : public PBD::StatefulDestructible /* source management */ - struct import_status : public InterThreadInfo { - string doing_what; + struct ImportStatus : public InterThreadInfo { + std::string doing_what; /* control info */ uint32_t total; @@ -624,14 +621,14 @@ class Session : public PBD::StatefulDestructible SourceList sources; }; - void import_audiofiles (import_status&); - bool sample_rate_convert (import_status&, string infile, string& outfile); - string build_tmp_convert_name (string file); + void import_audiofiles (ImportStatus&); + bool sample_rate_convert (ImportStatus&, std::string infile, std::string& outfile); + std::string build_tmp_convert_name (std::string file); boost::shared_ptr get_export_handler (); boost::shared_ptr get_export_status (); - int start_audio_export (nframes_t position, bool realtime); + int start_audio_export (nframes_t position, bool realtime); sigc::signal ProcessExport; sigc::signal ExportReadFinished; @@ -641,7 +638,7 @@ class Session : public PBD::StatefulDestructible void remove_source (boost::weak_ptr); struct cleanup_report { - vector paths; + std::vector paths; int64_t space; }; @@ -653,23 +650,19 @@ class Session : public PBD::StatefulDestructible int remove_last_capture (); - /* handlers should return -1 for "stop cleanup", 0 for - "yes, delete this playlist" and 1 for "no, don't delete - this playlist. + /** handlers should return -1 for "stop cleanup", + 0 for "yes, delete this playlist", + 1 for "no, don't delete this playlist". */ - sigc::signal > AskAboutPlaylistDeletion; - /* handlers should return 0 for "ignore the rate mismatch" - and !0 for "do not use this session" + /** handlers should return 0 for "ignore the rate mismatch", + !0 for "do not use this session" */ - static sigc::signal AskAboutSampleRateMismatch; - /* handlers should return !0 for use pending state, 0 for - ignore it. + /** handlers should return !0 for use pending state, 0 for ignore it. */ - static sigc::signal AskAboutPendingState; boost::shared_ptr create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive); @@ -681,7 +674,7 @@ class Session : public PBD::StatefulDestructible /* playlist management */ - boost::shared_ptr playlist_by_name (string name); + boost::shared_ptr playlist_by_name (std::string name); void unassigned_playlists (std::list > & list); void add_playlist (boost::shared_ptr, bool unused = false); sigc::signal > PlaylistAdded; @@ -694,7 +687,7 @@ class Session : public PBD::StatefulDestructible /* named selections */ - NamedSelection* named_selection_by_name (string name); + NamedSelection* named_selection_by_name (std::string name); void add_named_selection (NamedSelection *); void remove_named_selection (NamedSelection *); @@ -703,7 +696,6 @@ class Session : public PBD::StatefulDestructible sigc::signal NamedSelectionRemoved; /* Curves and AutomationLists (TODO when they go away) */ - void add_curve(Evoral::Curve*); void add_automation_list(AutomationList*); /* fade curves */ @@ -725,15 +717,18 @@ class Session : public PBD::StatefulDestructible /* flattening stuff */ boost::shared_ptr write_one_track (AudioTrack&, nframes_t start, nframes_t end, - bool overwrite, vector >&, InterThreadInfo& wot); + bool overwrite, std::vector >&, InterThreadInfo& wot, + bool enable_processing = true); int freeze (InterThreadInfo&); /* session-wide solo/mute/rec-enable */ - bool soloing() const { return currently_soloing; } + bool soloing() const { return _non_soloed_outs_muted; } + bool listening() const { return _listen_cnt > 0; } void set_all_solo (bool); void set_all_mute (bool); + void set_all_listen (bool); sigc::signal SoloActive; sigc::signal SoloChanged; @@ -743,14 +738,14 @@ class Session : public PBD::StatefulDestructible /* control/master out */ - boost::shared_ptr control_out() const { return _control_out; } - boost::shared_ptr master_out() const { return _master_out; } - - /* insert/send management */ + boost::shared_ptr control_out() const { return _control_out; } + boost::shared_ptr master_out() const { return _master_out; } - uint32_t n_port_inserts() const { return _port_inserts.size(); } - uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); } - uint32_t n_sends() const { return _sends.size(); } + void globally_add_internal_sends (boost::shared_ptr dest, Placement p); + void globally_set_send_gains_from_track (boost::shared_ptr dest); + void globally_set_send_gains_to_zero (boost::shared_ptr dest); + void globally_set_send_gains_to_unity (boost::shared_ptr dest); + void add_internal_sends (boost::shared_ptr dest, Placement p, boost::shared_ptr senders); static void set_disable_all_loaded_plugins (bool yn) { _disable_all_loaded_plugins = yn; @@ -760,8 +755,10 @@ class Session : public PBD::StatefulDestructible } uint32_t next_send_id(); + uint32_t next_return_id(); uint32_t next_insert_id(); void mark_send_id (uint32_t); + void mark_return_id (uint32_t); void mark_insert_id (uint32_t); /* s/w "RAID" management */ @@ -772,18 +769,18 @@ class Session : public PBD::StatefulDestructible void add_bundle (boost::shared_ptr); void remove_bundle (boost::shared_ptr); - boost::shared_ptr bundle_by_name (string) const; + boost::shared_ptr bundle_by_name (std::string) const; sigc::signal > BundleAdded; sigc::signal > BundleRemoved; - /* MIDI */ + /* MIDI control */ void midi_panic(void); - int set_mtc_port (string port_tag); - int set_mmc_port (string port_tag); - int set_midi_port (string port_tag); - int set_midi_clock_port (string port_tag); + int set_mtc_port (std::string port_tag); + int set_mmc_port (std::string port_tag); + int set_midi_port (std::string port_tag); + int set_midi_clock_port (std::string port_tag); MIDI::Port *mtc_port() const { return _mtc_port; } MIDI::Port *mmc_port() const { return _mmc_port; } MIDI::Port *midi_port() const { return _midi_port; } @@ -828,14 +825,15 @@ class Session : public PBD::StatefulDestructible uint32_t undo_depth() const { return _history.undo_depth(); } uint32_t redo_depth() const { return _history.redo_depth(); } - string next_undo() const { return _history.next_undo(); } - string next_redo() const { return _history.next_redo(); } + std::string next_undo() const { return _history.next_undo(); } + std::string next_redo() const { return _history.next_redo(); } - void begin_reversible_command (const string& cmd_name); + void begin_reversible_command (const std::string& cmd_name); void commit_reversible_command (Command* cmd = 0); void add_command (Command *const cmd) { - current_trans->add_command (cmd); + assert(!_current_trans.empty ()); + _current_trans.top()->add_command (cmd); } std::map registry; @@ -848,22 +846,21 @@ class Session : public PBD::StatefulDestructible class GlobalRouteStateCommand : public Command { - public: + public: GlobalRouteStateCommand (Session&, void*); GlobalRouteStateCommand (Session&, const XMLNode& node); - int set_state (const XMLNode&); + int set_state (const XMLNode&, int version); XMLNode& get_state (); - protected: + protected: GlobalRouteBooleanState before, after; Session& sess; void* src; - }; class GlobalSoloStateCommand : public GlobalRouteStateCommand { - public: + public: GlobalSoloStateCommand (Session &, void *src); GlobalSoloStateCommand (Session&, const XMLNode&); void operator()(); //redo @@ -874,7 +871,7 @@ class Session : public PBD::StatefulDestructible class GlobalMuteStateCommand : public GlobalRouteStateCommand { - public: + public: GlobalMuteStateCommand(Session &, void *src); GlobalMuteStateCommand (Session&, const XMLNode&); void operator()(); // redo @@ -885,7 +882,7 @@ class Session : public PBD::StatefulDestructible class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand { - public: + public: GlobalRecordEnableStateCommand(Session &, void *src); GlobalRecordEnableStateCommand (Session&, const XMLNode&); void operator()(); // redo @@ -896,16 +893,16 @@ class Session : public PBD::StatefulDestructible class GlobalMeteringStateCommand : public Command { - public: + public: GlobalMeteringStateCommand(Session &, void *src); GlobalMeteringStateCommand (Session&, const XMLNode&); void operator()(); void undo(); XMLNode &get_state(); - int set_state (const XMLNode&); + int set_state (const XMLNode&, int version); void mark(); - protected: + protected: Session& sess; void* src; GlobalRouteMeterState before; @@ -914,7 +911,7 @@ class Session : public PBD::StatefulDestructible /* clicking */ - boost::shared_ptr click_io() { return _click_io; } + boost::shared_ptr click_io() { return _click_io; } /* disk, buffer loads */ @@ -931,8 +928,8 @@ class Session : public PBD::StatefulDestructible /* ranges */ - void set_audio_range (list&); - void set_music_range (list&); + void set_audio_range (std::list&); + void set_music_range (std::list&); void request_play_range (bool yn); bool get_play_range () const { return _play_range; } @@ -942,6 +939,8 @@ class Session : public PBD::StatefulDestructible gain_t* gain_automation_buffer () const { return _gain_automation_buffer; } pan_t** pan_automation_buffer () const { return _pan_automation_buffer; } + void ensure_buffer_set (BufferSet& buffers, const ChanCount& howmany); + /* VST support */ static long vst_callback (AEffect* effect, @@ -962,6 +961,12 @@ class Session : public PBD::StatefulDestructible SessionMetadata & metadata () { return *_metadata; } + SessionConfiguration config; + + bool exporting () const { + return _exporting; + } + protected: friend class AudioEngine; void set_block_size (nframes_t nframes); @@ -978,7 +983,7 @@ class Session : public PBD::StatefulDestructible void update_latency_compensation (bool, bool); private: - int create (bool& new_session, const string& mix_template, nframes_t initial_length); + int create (bool& new_session, const std::string& mix_template, nframes_t initial_length); void destroy (); nframes_t compute_initial_length (); @@ -1013,14 +1018,13 @@ class Session : public PBD::StatefulDestructible Location* start_location; Slave* _slave; bool _silent; - volatile double _transport_speed; - double _last_transport_speed; - // fixed point transport speed for varispeed playback - uint64_t phi; - // fixed point target transport speed for varispeed playback when tempo changes - uint64_t target_phi; - // fixed point phase for varispeed playback - uint64_t phase; + + // varispeed playback + volatile double _transport_speed; + double _last_transport_speed; + double _target_transport_speed; + CubicInterpolation interpolation; + bool auto_play_legal; nframes_t _last_slave_transport_frame; nframes_t maximum_output_latency; @@ -1035,10 +1039,12 @@ class Session : public PBD::StatefulDestructible bool _have_captured; float _meter_hold; float _meter_falloff; - bool _end_location_is_free; + bool _non_soloed_outs_muted; + uint32_t _listen_cnt; + bool _writable; void set_worst_io_latencies (); - void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) { + void set_worst_io_latencies_x (IOChange, void *) { set_worst_io_latencies (); } @@ -1053,6 +1059,10 @@ class Session : public PBD::StatefulDestructible void process_export (nframes_t); int process_export_fw (nframes_t); + void block_processing() { g_atomic_int_set (&processing_prohibited, 1); } + void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); } + bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); } + /* slave tracking */ static const int delta_accumulator_size = 25; @@ -1072,15 +1082,12 @@ class Session : public PBD::StatefulDestructible nframes_t slave_wait_end; void reset_slave_state (); - bool follow_slave (nframes_t, nframes_t); + bool follow_slave (nframes_t); void calculate_moving_average_of_slave_delta(int dir, nframes_t this_delta); - void track_slave_state( - float slave_speed, - nframes_t slave_transport_frame, - nframes_t this_delta, - bool starting); - void follow_slave_silently(nframes_t nframes, nframes_t offset, float slave_speed); - + void track_slave_state(float slave_speed, nframes_t slave_transport_frame, + nframes_t this_delta, bool starting); + void follow_slave_silently(nframes_t nframes, float slave_speed); + void set_slave_source (SlaveSource); SlaveSource post_export_slave; @@ -1088,26 +1095,26 @@ class Session : public PBD::StatefulDestructible bool _exporting; bool _exporting_realtime; - + boost::shared_ptr export_handler; boost::shared_ptr export_status; int pre_export (); int stop_audio_export (); void finalize_audio_export (); - + sigc::connection export_freewheel_connection; void prepare_diskstreams (); void commit_diskstreams (nframes_t, bool& session_requires_butler); - int process_routes (nframes_t, nframes_t); - int silent_process_routes (nframes_t, nframes_t); + int process_routes (nframes_t); + int silent_process_routes (nframes_t); bool get_rec_monitors_input () { if (actively_recording()) { return true; } else { - if (Config->get_auto_input()) { + if (config.get_auto_input()) { return false; } else { return true; @@ -1116,7 +1123,6 @@ class Session : public PBD::StatefulDestructible } int get_transport_declick_required () { - if (transport_sub_state & PendingDeclickIn) { transport_sub_state &= ~PendingDeclickIn; return 1; @@ -1128,14 +1134,15 @@ class Session : public PBD::StatefulDestructible } bool maybe_stop (nframes_t limit) { - if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) { + if ( (_transport_speed > 0.0f && _transport_frame >= limit) + || (_transport_speed < 0.0f && _transport_frame == 0) ) { stop_transport (); return true; } return false; } - bool maybe_sync_start (nframes_t&, nframes_t&); + bool maybe_sync_start (nframes_t&); void check_declick_out (); @@ -1144,8 +1151,8 @@ class Session : public PBD::StatefulDestructible MIDI::Port* _mtc_port; MIDI::Port* _midi_port; MIDI::Port* _midi_clock_port; - string _path; - string _name; + std::string _path; + std::string _name; bool session_send_mmc; bool session_send_mtc; bool session_midi_feedback; @@ -1161,17 +1168,15 @@ class Session : public PBD::StatefulDestructible void when_engine_running (); void graph_reordered (); - string _current_snapshot_name; + std::string _current_snapshot_name; - XMLTree* state_tree; - bool state_was_pending; + XMLTree* state_tree; + bool state_was_pending; StateOfTheState _state_of_the_state; void auto_save(); int load_options (const XMLNode&); - XMLNode& get_options () const; - int load_state (string snapshot_name); - bool save_config_options_predicate (ConfigVariableBase::Owner owner) const; + int load_state (std::string snapshot_name); nframes_t _last_roll_location; nframes_t _last_record_location; @@ -1182,8 +1187,6 @@ class Session : public PBD::StatefulDestructible bool pending_abort; bool pending_auto_loop; - Sample* butler_mixdown_buffer; - float* butler_gain_buffer; pthread_t butler_thread; Glib::Mutex butler_request_lock; Glib::Cond butler_paused; @@ -1191,7 +1194,9 @@ class Session : public PBD::StatefulDestructible mutable gint butler_should_do_transport_work; int butler_request_pipe[2]; - inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); } + inline bool transport_work_requested() const { + return g_atomic_int_get(&butler_should_do_transport_work); + } struct ButlerRequest { enum Type { @@ -1263,7 +1268,7 @@ class Session : public PBD::StatefulDestructible sigc::connection auto_loop_changed_connection; void auto_loop_changed (Location *); - typedef list Events; + typedef std::list Events; Events events; Events immediate_events; Events::iterator next_event; @@ -1284,7 +1289,7 @@ class Session : public PBD::StatefulDestructible bool _remove_event (Event *); void _clear_event_type (Event::Type); - void first_stage_init (string path, string snapshot_name); + void first_stage_init (std::string path, std::string snapshot_name); int second_stage_init (bool new_tracks); void find_current_end (); void remove_empty_sounds (); @@ -1344,7 +1349,7 @@ class Session : public PBD::StatefulDestructible double step_speed; typedef sigc::slot MidiTimeoutCallback; - typedef list MidiTimeoutList; + typedef std::list MidiTimeoutList; MidiTimeoutList midi_timeouts; bool mmc_step_timeout (); @@ -1378,7 +1383,8 @@ class Session : public PBD::StatefulDestructible void reset_record_status (); - int no_roll (nframes_t nframes, nframes_t offset); + int no_roll (nframes_t nframes); + int fail_roll (nframes_t nframes); bool non_realtime_work_pending() const { return static_cast(post_transport_work); } bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); } @@ -1431,13 +1437,9 @@ class Session : public PBD::StatefulDestructible /* edit/mix groups */ - int load_route_groups (const XMLNode&, bool is_edit); - int load_edit_groups (const XMLNode&); - int load_mix_groups (const XMLNode&); + int load_route_groups (const XMLNode&, int); - - list edit_groups; - list mix_groups; + std::list _route_groups; /* disk-streams */ @@ -1445,29 +1447,28 @@ class Session : public PBD::StatefulDestructible uint32_t audio_dstream_buffer_size; uint32_t midi_dstream_buffer_size; - int load_diskstreams (const XMLNode&); + int load_diskstreams (const XMLNode&); /* routes stuff */ SerializedRCUManager routes; - void add_routes (RouteList&, bool save); + void add_routes (RouteList&, bool save); uint32_t destructive_index; - boost::shared_ptr XMLRouteFactory (const XMLNode&); + boost::shared_ptr XMLRouteFactory (const XMLNode&, int); /* mixer stuff */ - bool solo_update_disabled; - bool currently_soloing; + bool solo_update_disabled; + void route_listen_changed (void *src, boost::weak_ptr); void route_mute_changed (void *src); void route_solo_changed (void *src, boost::weak_ptr); - void catch_up_on_solo (); - void catch_up_on_solo_mute_override (); - void update_route_solo_state (); - void modify_solo_mute (bool, bool); - void strip_portname_for_solo (string& portname); + void update_route_solo_state (boost::shared_ptr r = boost::shared_ptr()); + + void listen_position_changed (); + void solo_control_mode_changed (); /* REGION MANAGEMENT */ @@ -1475,7 +1476,7 @@ class Session : public PBD::StatefulDestructible void update_region_name_map (boost::shared_ptr); mutable Glib::Mutex region_lock; - typedef map > RegionList; + typedef std::map > RegionList; RegionList regions; void add_region (boost::shared_ptr); @@ -1484,6 +1485,8 @@ class Session : public PBD::StatefulDestructible int load_regions (const XMLNode& node); + void route_group_changed (); + /* SOURCES */ mutable Glib::Mutex source_lock; @@ -1495,8 +1498,6 @@ class Session : public PBD::StatefulDestructible SourceMap get_sources() { return sources; } private: - - int load_sources (const XMLNode& node); XMLNode& get_sources_as_xml (); @@ -1505,7 +1506,7 @@ class Session : public PBD::StatefulDestructible /* PLAYLISTS */ mutable Glib::Mutex playlist_lock; - typedef set > PlaylistList; + typedef std::set > PlaylistList; PlaylistList playlists; PlaylistList unused_playlists; @@ -1514,7 +1515,7 @@ class Session : public PBD::StatefulDestructible void remove_playlist (boost::weak_ptr); void track_playlist (bool, boost::weak_ptr); - boost::shared_ptr playlist_factory (string name); + boost::shared_ptr playlist_factory (std::string name); boost::shared_ptr XMLPlaylistFactory (const XMLNode&); void playlist_length_changed (); @@ -1523,16 +1524,15 @@ class Session : public PBD::StatefulDestructible /* NAMED SELECTIONS */ mutable Glib::Mutex named_selection_lock; - typedef set NamedSelectionList; + typedef std::set NamedSelectionList; NamedSelectionList named_selections; int load_named_selections (const XMLNode&); - NamedSelection *named_selection_factory (string name); + NamedSelection *named_selection_factory (std::string name); NamedSelection *XMLNamedSelectionFactory (const XMLNode&); /* CURVES and AUTOMATION LISTS */ - std::map curves; std::map automation_lists; /* DEFAULT FADE CURVES */ @@ -1555,14 +1555,9 @@ class Session : public PBD::StatefulDestructible /* INSERT AND SEND MANAGEMENT */ - list _port_inserts; - list _plugin_inserts; - list _sends; boost::dynamic_bitset send_bitset; + boost::dynamic_bitset return_bitset; boost::dynamic_bitset insert_bitset; - uint32_t send_cnt; - uint32_t insert_cnt; - void add_processor (Processor *); void remove_processor (Processor *); @@ -1571,7 +1566,7 @@ class Session : public PBD::StatefulDestructible struct space_and_path { uint32_t blocks; /* 4kB blocks */ - string path; + std::string path; space_and_path() { blocks = 0; @@ -1584,14 +1579,14 @@ class Session : public PBD::StatefulDestructible } }; - void setup_raid_path (string path); + void setup_raid_path (std::string path); - vector session_dirs; - vector::iterator last_rr_session_dir; + std::vector session_dirs; + std::vector::iterator last_rr_session_dir; uint32_t _total_free_4k_blocks; Glib::Mutex space_lock; - string get_best_session_directory_for_new_source (); + std::string get_best_session_directory_for_new_source (); void refresh_disk_space (); mutable gint _playback_load; @@ -1607,8 +1602,8 @@ class Session : public PBD::StatefulDestructible void reverse_diskstream_buffers (); - UndoHistory _history; - UndoTransaction* current_trans; + UndoHistory _history; + std::stack _current_trans; GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const); GlobalRouteMeterState get_global_route_metering (); @@ -1638,19 +1633,19 @@ class Session : public PBD::StatefulDestructible Click (nframes_t s, nframes_t d, const Sample *b) : start (s), duration (d), data (b) { offset = 0; } - void *operator new(size_t ignored) { + void *operator new (size_t) { return pool.alloc (); }; - void operator delete(void *ptr, size_t size) { + void operator delete(void *ptr, size_t /*size*/) { pool.release (ptr); } - private: + private: static Pool pool; }; - typedef list Clicks; + typedef std::list Clicks; Clicks clicks; bool _clicking; @@ -1669,13 +1664,13 @@ class Session : public PBD::StatefulDestructible Click *get_click(); void setup_click_sounds (int which); void clear_clicks (); - void click (nframes_t start, nframes_t nframes, nframes_t offset); + void click (nframes_t start, nframes_t nframes); - vector master_outs; + std::vector master_outs; /* range playback */ - list current_audio_range; + std::list current_audio_range; bool _play_range; void set_play_range (bool yn); void setup_auto_play (); @@ -1683,8 +1678,8 @@ class Session : public PBD::StatefulDestructible /* main outs */ uint32_t main_outs; - boost::shared_ptr _master_out; - boost::shared_ptr _control_out; + boost::shared_ptr _master_out; + boost::shared_ptr _control_out; gain_t* _gain_automation_buffer; pan_t** _pan_automation_buffer; @@ -1716,9 +1711,6 @@ class Session : public PBD::StatefulDestructible int find_all_sources (std::string path, std::set& result); int find_all_sources_across_snapshots (std::set& result, bool exclude_this_snapshot); - LayerModel layer_model; - CrossfadeModel xfade_model; - typedef std::set > Controllables; Glib::Mutex controllables_lock; Controllables controllables; @@ -1727,7 +1719,7 @@ class Session : public PBD::StatefulDestructible bool first_file_data_format_reset; bool first_file_header_format_reset; - void config_changed (const char*); + void config_changed (std::string, bool); XMLNode& get_control_protocol_state (); @@ -1735,10 +1727,13 @@ class Session : public PBD::StatefulDestructible void sync_order_keys (); static bool _disable_all_loaded_plugins; - + SessionMetadata * _metadata; mutable bool have_looped; ///< Used in ::audible_frame(*) + + void update_have_rec_enabled_diskstream (); + gint _have_rec_enabled_diskstream; }; } // namespace ARDOUR