X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsession.h;h=ef0d5d94f490709e7604f20d963e0e0c489b40f2;hb=b72d37a45f77f43233cd883a0e78d38fef975786;hp=f77e09736f3df0eb7a43986e1abf15fdd88028c4;hpb=2a7ed69c28c5c4606ff13b3605b9bc9c3eba607d;p=ardour.git diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f77e09736f..ef0d5d94f4 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1,19 +1,19 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000 Paul Davis - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ @@ -48,6 +48,7 @@ #include "evoral/types.hpp" #include "midi++/types.h" +#include "midi++/mmc.h" #include "timecode/time.h" @@ -62,10 +63,6 @@ #include "ardour/interpolation.h" #include "ardour/route_graph.h" -#ifdef HAVE_JACK_SESSION -#include -#endif - class XMLTree; class XMLNode; @@ -73,18 +70,18 @@ struct _AEffect; typedef struct _AEffect AEffect; namespace MIDI { - class Port; - class MachineControl; - class Parser; +class Port; +class MachineControl; +class Parser; } namespace PBD { - class Controllable; - class ControllableDescriptor; +class Controllable; +class ControllableDescriptor; } namespace Evoral { - class Curve; +class Curve; } namespace ARDOUR { @@ -129,6 +126,7 @@ class Route; class RouteGroup; class SMFSource; class Send; +class SceneChanger; class SessionDirectory; class SessionMetadata; class SessionPlaylists; @@ -162,7 +160,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop virtual ~Session (); - static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format); + static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format); std::string path() const { return _path; } std::string name() const { return _name; } @@ -194,13 +192,16 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop std::string peak_path (std::string) const; - std::string change_source_path_by_name (std::string oldpath, std::string oldname, std::string newname, bool destructive); - 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, const std::string& name); + bool audio_source_name_is_unique (const std::string& name, uint32_t chan); + std::string format_audio_source_name (const std::string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists); + std::string new_audio_source_path_for_embedded (const std::string& existing_path); + std::string new_audio_source_path (const std::string&, uint32_t nchans, uint32_t chan, bool destructive, bool take_required); + std::string new_midi_source_path (const std::string&); + RouteList new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name); + std::vector 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 callback); void process (pframes_t nframes); @@ -226,8 +227,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop return routes.reader (); } + boost::shared_ptr get_tracks() const; boost::shared_ptr get_routes_with_internal_returns() const; - boost::shared_ptr get_routes_with_regions_at (framepos_t const) const; uint32_t nroutes() const { return routes.reader()->size(); } @@ -243,8 +244,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop }; void set_order_hint (uint32_t order_hint) {_order_hint = order_hint;}; - void notify_remote_id_change (); - void sync_order_keys (); + void notify_remote_id_change (); + void sync_order_keys (); template void foreach_route (T *obj, void (T::*func)(Route&)); template void foreach_route (T *obj, void (T::*func)(boost::shared_ptr)); @@ -256,11 +257,15 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop boost::shared_ptr route_by_id (PBD::ID); boost::shared_ptr route_by_remote_id (uint32_t id); boost::shared_ptr track_by_diskstream_id (PBD::ID); - void routes_using_input_from (const std::string& str, RouteList& rl); + void routes_using_input_from (const std::string& str, RouteList& rl); bool route_name_unique (std::string) const; bool route_name_internal (std::string) const; + uint32_t track_number_decimals () const { + return _track_number_decimals; + } + bool get_record_enabled() const { return (record_status () >= Enabled); } @@ -296,7 +301,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop * - change in the play range (from the process thread) * - start (from the process thread) * - engine halted - */ + */ PBD::Signal0 TransportStateChange; PBD::Signal1 PositionChanged; /* sent after any non-sequential motion */ @@ -338,8 +343,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void goto_start (); void use_rf_shuttle_speed (); void allow_auto_play (bool yn); - void request_transport_speed (double speed, bool as_default = false); - void request_transport_speed_nonzero (double, bool as_default = false); + void request_transport_speed (double speed, bool as_default = false); + void request_transport_speed_nonzero (double, bool as_default = false); void request_overwrite_buffer (Track *); void adjust_playback_buffering(); void adjust_capture_buffering(); @@ -379,6 +384,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); int location_name(std::string& result, std::string base = std::string("")); pframes_t get_block_size() const { return current_block_size; } @@ -398,13 +404,28 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop int rename (const std::string&); bool get_nsm_state () const { return _under_nsm_control; } void set_nsm_state (bool state) { _under_nsm_control = state; } + bool save_default_options (); PBD::Signal1 StateSaved; PBD::Signal0 StateReady; - PBD::Signal0 SaveSession; - std::vector* possible_states() const; - static std::vector* possible_states (std::string path); + /* emitted when session needs to be saved due to some internal + * event or condition (i.e. not in response to a user request). + * + * Only one object should + * connect to this signal and take responsibility. + * + * Argument is the snapshot name to use when saving. + */ + PBD::Signal1 SaveSessionRequested; + + /* emitted during a session save to allow other entities to add state, via + * extra XML, to the session state + */ + PBD::Signal0 SessionSaveUnderway; + + std::vector possible_states() const; + static std::vector possible_states (std::string path); XMLNode& get_state(); int set_state(const XMLNode& node, int version); // not idempotent @@ -426,6 +447,23 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop StateOfTheState state_of_the_state() const { return _state_of_the_state; } + class StateProtector { + public: + StateProtector (Session* s) : _session (s) { + g_atomic_int_inc (&s->_suspend_save); + } + ~StateProtector () { + if (g_atomic_int_dec_and_test (&_session->_suspend_save)) { + while (_session->_save_queued) { + _session->_save_queued = false; + _session->save_state (""); + } + } + } + private: + Session * _session; + }; + void add_route_group (RouteGroup *); void remove_route_group (RouteGroup&); void reorder_route_groups (std::list); @@ -479,8 +517,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /* Time */ framepos_t transport_frame () const {return _transport_frame; } + framepos_t record_location () const {return _last_record_location; } framepos_t audible_frame () const; framepos_t requested_return_frame() const { return _requested_return_frame; } + void set_requested_return_frame(framepos_t return_to); enum PullupFormat { pullup_Plus4Plus1, @@ -504,7 +544,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void timecode_time_subframes (framepos_t when, Timecode::Time&); void timecode_duration (framecnt_t, Timecode::Time&) const; - void timecode_duration_string (char *, size_t len, framecnt_t) const; + void timecode_duration_string (char *, size_t len, framecnt_t) const; framecnt_t convert_to_frames (AnyTime const & position); framecnt_t any_duration_to_frames (framepos_t position, AnyTime const & duration); @@ -522,14 +562,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void set_silent (bool yn); bool silent () { return _silent; } - TempoMap& tempo_map() { return *_tempo_map; } + TempoMap& tempo_map() { return *_tempo_map; } + const TempoMap& tempo_map() const { return *_tempo_map; } /* region info */ boost::shared_ptr find_whole_file_parent (boost::shared_ptr) const; - std::string path_from_region_name (DataType type, std::string name, std::string identifier); - boost::shared_ptr XMLRegionFactory (const XMLNode&, bool full); boost::shared_ptr XMLAudioRegionFactory (const XMLNode&, bool full); boost::shared_ptr XMLMidiRegionFactory (const XMLNode&, bool full); @@ -559,10 +598,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop int remove_last_capture (); - /** handlers should return 0 for "everything OK", and any other value for + /** handlers should return 0 for "everything OK", and any other value for * "cannot setup audioengine". */ - static PBD::Signal1 AudioEngineSetupRequired; + static PBD::Signal1 AudioEngineSetupRequired; /** handlers should return -1 for "stop cleanup", 0 for "yes, delete this playlist", @@ -576,17 +615,18 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop static PBD::Signal2 AskAboutSampleRateMismatch; /** handlers should return !0 for use pending state, 0 for ignore it. - */ + */ static PBD::Signal0 AskAboutPendingState; boost::shared_ptr create_audio_source_for_session ( size_t, std::string const &, uint32_t, bool destructive); - boost::shared_ptr create_midi_source_for_session ( - Track*, std::string const &); + boost::shared_ptr create_midi_source_for_session (std::string const &); + boost::shared_ptr create_midi_source_by_stealing_name (boost::shared_ptr); boost::shared_ptr source_by_id (const PBD::ID&); - boost::shared_ptr source_by_path_and_channel (const std::string&, uint16_t); + boost::shared_ptr audio_source_by_path_and_channel (const std::string&, uint16_t) const; + boost::shared_ptr midi_source_by_path (const std::string&) const; uint32_t count_sources_by_origin (const std::string&); void add_playlist (boost::shared_ptr, bool unused = false); @@ -606,9 +646,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /* flattening stuff */ - boost::shared_ptr write_one_track (AudioTrack&, framepos_t start, framepos_t end, - bool overwrite, std::vector >&, InterThreadInfo& wot, - boost::shared_ptr endpoint, bool include_endpoint, bool for_export); + boost::shared_ptr write_one_track (Track&, framepos_t start, framepos_t end, + bool overwrite, std::vector >&, InterThreadInfo& wot, + boost::shared_ptr endpoint, + bool include_endpoint, bool for_export, bool for_freeze); int freeze_all (InterThreadInfo&); /* session-wide solo/mute/rec-enable */ @@ -627,7 +668,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void set_record_enabled (boost::shared_ptr, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false); void set_solo_isolated (boost::shared_ptr, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false); void set_monitoring (boost::shared_ptr, MonitorChoice, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false); - void set_exclusive_input_active (boost::shared_ptr rt, bool onoff, bool flip_others=false); + void set_exclusive_input_active (boost::shared_ptr rt, bool onoff, bool flip_others=false); PBD::Signal1 SoloActive; PBD::Signal0 SoloChanged; @@ -706,6 +747,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void begin_reversible_command (const std::string& cmd_name); void begin_reversible_command (GQuark); + void abort_reversible_command (); void commit_reversible_command (Command* cmd = 0); void add_command (Command *const cmd) { @@ -742,6 +784,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /* ranges */ void request_play_range (std::list*, bool leave_rolling = false); + void request_cancel_play_range (); bool get_play_range () const { return _play_range; } void maybe_update_session_range (framepos_t, framepos_t); @@ -756,6 +799,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /* VST support */ + static int vst_current_loading_id; + static const char* vst_can_do_strings[]; + static const int vst_can_do_string_count; + static intptr_t vst_callback ( AEffect* effect, int32_t opcode, @@ -787,6 +834,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop return _exporting; } + bool bounce_processing() const { + return _bounce_processing_active; + } + /* this is a private enum, but setup_enum_writer() needs it, and i can't find a way to give that function friend access. sigh. @@ -816,13 +867,13 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop }; SlaveState slave_state() const { return _slave_state; } - Slave* slave() const { return _slave; } + Slave* slave() const { return _slave; } boost::shared_ptr playlists; void send_mmc_locate (framepos_t); - void queue_full_time_code () { _send_timecode_update = true; } - void queue_song_position_pointer () { /* currently does nothing */ } + void queue_full_time_code () { _send_timecode_update = true; } + void queue_song_position_pointer () { /* currently does nothing */ } bool step_editing() const { return (_step_editors > 0); } @@ -832,6 +883,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop std::vector source_search_path(DataType) const; void ensure_search_path_includes (const std::string& path, DataType type); + void remove_dir_from_search_path (const std::string& path, DataType type); std::list unknown_processors () const; @@ -860,33 +912,42 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /** Emitted when the session wants Ardour to quit */ static PBD::Signal0 Quit; - /** Emitted when Ardour is asked to load a session in an older session + /** Emitted when Ardour is asked to load a session in an older session * format, and makes a backup copy. */ - static PBD::Signal2 VersionMismatch; + static PBD::Signal2 VersionMismatch; + + SceneChanger* scene_changer() const { return _scene_changer; } - boost::shared_ptr ltc_input_port() const; - boost::shared_ptr ltc_output_port() const; + boost::shared_ptr ltc_input_port() const; + boost::shared_ptr ltc_output_port() const; boost::shared_ptr ltc_input_io() { return _ltc_input; } boost::shared_ptr ltc_output_io() { return _ltc_output; } - MIDI::Port* midi_input_port () const; - MIDI::Port* midi_output_port () const; - MIDI::Port* mmc_output_port () const; - MIDI::Port* mmc_input_port () const; + MIDI::Port* midi_input_port () const; + MIDI::Port* midi_output_port () const; + MIDI::Port* mmc_output_port () const; + MIDI::Port* mmc_input_port () const; - boost::shared_ptr midi_clock_output_port () const; - boost::shared_ptr midi_clock_input_port () const; - boost::shared_ptr mtc_output_port () const; - boost::shared_ptr mtc_input_port () const; + MIDI::Port* scene_input_port () const; + MIDI::Port* scene_output_port () const; - MIDI::MachineControl& mmc() { return *_mmc; } + boost::shared_ptr scene_in () const; + boost::shared_ptr scene_out () const; + + boost::shared_ptr midi_clock_output_port () const; + boost::shared_ptr midi_clock_input_port () const; + boost::shared_ptr mtc_output_port () const; + boost::shared_ptr mtc_input_port () const; + + MIDI::MachineControl& mmc() { return *_mmc; } protected: friend class AudioEngine; void set_block_size (pframes_t nframes); void set_frame_rate (framecnt_t nframes); + void reconnect_existing_routes (bool withLock, bool reconnect_master = true, bool reconnect_inputs = true, bool reconnect_outputs = true); protected: friend class Route; @@ -916,6 +977,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop mutable gint processing_prohibited; process_function_type process_function; process_function_type last_process_function; + bool _bounce_processing_active; bool waiting_for_sync_offset; framecnt_t _base_frame_rate; framecnt_t _current_frame_rate; //this includes video pullup offset @@ -943,8 +1005,6 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop framecnt_t _worst_input_latency; framecnt_t _worst_track_latency; bool _have_captured; - float _meter_hold; - float _meter_falloff; bool _non_soloed_outs_muted; uint32_t _listen_cnt; uint32_t _solo_isolated_cnt; @@ -970,13 +1030,15 @@ 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 (pframes_t); int 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); } bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); } + static const framecnt_t bounce_chunk_size; + /* slave tracking */ static const int delta_accumulator_size = 25; @@ -1022,8 +1084,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop int silent_process_routes (pframes_t, bool& need_butler); /** @return 1 if there is a pending declick fade-in, - -1 if there is a pending declick fade-out, - 0 if there is no pending declick. + -1 if there is a pending declick fade-out, + 0 if there is no pending declick. */ int get_transport_declick_required () { if (transport_sub_state & PendingDeclickIn) { @@ -1075,7 +1137,11 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop bool state_was_pending; StateOfTheState _state_of_the_state; - void auto_save(); + friend class StateProtector; + gint _suspend_save; /* atomic */ + volatile bool _save_queued; + Glib::Threads::Mutex save_state_lock; + int load_options (const XMLNode&); int load_state (std::string snapshot_name); @@ -1094,17 +1160,17 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop static const PostTransportWork ProcessCannotProceedMask = PostTransportWork ( - PostTransportInputChange| - PostTransportSpeed| - PostTransportReverse| - PostTransportCurveRealloc| - PostTransportAudition| - PostTransportLocate| - PostTransportStop| - PostTransportClearSubstate); + PostTransportInputChange| + PostTransportSpeed| + PostTransportReverse| + PostTransportCurveRealloc| + PostTransportAudition| + PostTransportLocate| + PostTransportStop| + PostTransportClearSubstate); gint _post_transport_work; /* accessed only atomic ops */ - PostTransportWork post_transport_work() const { return (PostTransportWork) g_atomic_int_get (const_cast(&_post_transport_work)); } + PostTransportWork post_transport_work() const { return (PostTransportWork) g_atomic_int_get (const_cast(&_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); @@ -1118,9 +1184,20 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void reset_rf_scale (framecnt_t frames_moved); Locations* _locations; - void locations_changed (); - void locations_added (Location*); - void handle_locations_changed (Locations::LocationList&); + void location_added (Location*); + void location_removed (Location*); + void locations_changed (); + void _locations_changed (const Locations::LocationList&); + + void update_skips (Location*, bool consolidate); + void update_marks (Location* loc); + void update_loop (Location* loc); + void consolidate_skips (Location*); + void sync_locations_to_skips (); + void _sync_locations_to_skips (); + + PBD::ScopedConnectionList skip_update_connections; + bool _ignore_skips_updates; PBD::ScopedConnectionList punch_connections; void auto_punch_start_changed (Location *); @@ -1131,10 +1208,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void auto_loop_changed (Location *); void auto_loop_declick_range (Location *, framepos_t &, framepos_t &); - int ensure_engine (uint32_t desired_sample_rate); + int ensure_engine (uint32_t desired_sample_rate); void pre_engine_init (std::string path); int post_engine_init (); - int immediately_post_engine (); + int immediately_post_engine (); void remove_empty_sounds (); void setup_midi_control (); @@ -1197,6 +1274,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop MidiTimeoutList midi_timeouts; bool mmc_step_timeout (); + void send_immediate_mmc (MIDI::MachineControlCommand); MIDI::byte mtc_msg[16]; MIDI::byte mtc_timecode_bits; /* encoding of SMTPE type for MTC */ @@ -1259,7 +1337,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop int start_midi_thread (); - void set_play_loop (bool yn); + void set_play_loop (bool yn, double speed); void unset_play_loop (); void overwrite_some_buffers (Track *); void flush_all_inserts (); @@ -1268,7 +1346,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void start_locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false); void force_locate (framepos_t frame, bool with_roll = false); void set_track_speed (Track *, double speed); - void set_transport_speed (double speed, bool abort = false, bool clear_state = false, bool as_default = false); + void set_transport_speed (double speed, framepos_t destination_frame, bool abort = false, bool clear_state = false, bool as_default = false); void stop_transport (bool abort = false, bool clear_state = false); void start_transport (); void realtime_stop (bool abort, bool clear_state); @@ -1281,13 +1359,14 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop void post_transport (); void engine_halted (); void xrun_recovery (); + void set_track_loop (bool); + + /* These are synchronous and so can only be called from within the process + * cycle + */ - /* These are synchronous and so can only be called from within the process - * cycle - */ - - int send_full_time_code (framepos_t, pframes_t nframes); - void send_song_position_pointer (framepos_t); + int send_full_time_code (framepos_t, pframes_t nframes); + void send_song_position_pointer (framepos_t); TempoMap *_tempo_map; void tempo_map_changed (const PBD::PropertyChange&); @@ -1306,8 +1385,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop SerializedRCUManager routes; void add_routes (RouteList&, bool input_auto_connect, bool output_auto_connect, bool save); - void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect); - bool _adding_routes_in_progress; + void add_routes_inner (RouteList&, bool input_auto_connect, bool output_auto_connect); + bool _adding_routes_in_progress; uint32_t destructive_index; boost::shared_ptr XMLRouteFactory (const XMLNode&, int); @@ -1322,6 +1401,11 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop ChanCount input_start = ChanCount (), ChanCount output_start = ChanCount ()); void midi_output_change_handler (IOChange change, void* /*src*/, boost::weak_ptr midi_track); + /* track numbering */ + + void reassign_track_numbers (); + uint32_t _track_number_decimals; + /* mixer stuff */ bool solo_update_disabled; @@ -1434,7 +1518,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop bool no_questions_about_missing_files; - std::string get_best_session_directory_for_new_source (); + std::string get_best_session_directory_for_new_audio (); mutable gint _playback_load; mutable gint _capture_load; @@ -1454,7 +1538,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop */ std::list _current_trans_quarks; - int backend_sync_callback (TransportState, framepos_t); + int backend_sync_callback (TransportState, framepos_t); void process_rtop (SessionEvent*); @@ -1545,7 +1629,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /* realtime "apply to set of routes" operations */ template SessionEvent* get_rt_event (boost::shared_ptr rl, T targ, SessionEvent::RTeventCallback after, bool group_override, - void (Session::*method) (boost::shared_ptr, T, bool)) { + void (Session::*method) (boost::shared_ptr, T, bool)) { SessionEvent* ev = new SessionEvent (SessionEvent::RealTimeOperation, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0); ev->rt_slot = boost::bind (method, this, rl, targ, group_override); ev->rt_return = after; @@ -1576,7 +1660,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop /** true if timecode transmission by the transport is suspended, otherwise false */ mutable gint _suspend_timecode_transmission; - void update_locations_after_tempo_map_change (Locations::LocationList &); + void update_locations_after_tempo_map_change (const Locations::LocationList &); void start_time_changed (framepos_t); void end_time_changed (framepos_t); @@ -1598,24 +1682,28 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop MidiClockTicker* midi_clock; - boost::shared_ptr _ltc_input; - boost::shared_ptr _ltc_output; - - void reconnect_ltc_input (); - void reconnect_ltc_output (); - - /* persistent, non-track related MIDI ports */ - MidiPortManager* _midi_ports; - MIDI::MachineControl* _mmc; - - void setup_ltc (); - void setup_click (); - void setup_click_state (const XMLNode*); - void setup_bundles (); - - static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); + boost::shared_ptr _ltc_input; + boost::shared_ptr _ltc_output; + + void reconnect_ltc_input (); + void reconnect_ltc_output (); + + /* Scene Changing */ + SceneChanger* _scene_changer; + + /* persistent, non-track related MIDI ports */ + MidiPortManager* _midi_ports; + MIDI::MachineControl* _mmc; + + void setup_ltc (); + void setup_click (); + void setup_click_state (const XMLNode*); + void setup_bundles (); + + static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath); }; + } // namespace ARDOUR #endif /* __ardour_session_h__ */