diff options
-rw-r--r-- | libs/ardour/session.cc | 98 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 191 |
2 files changed, 137 insertions, 152 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 2d57fcfba8..687469e5a5 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -87,6 +87,7 @@ #include "ardour/session_playlists.h" #include "ardour/smf_source.h" #include "ardour/source_factory.h" +#include "ardour/speakers.h" #include "ardour/utils.h" #include "midi++/port.h" @@ -135,9 +136,9 @@ Session::Session (AudioEngine &eng, , _target_transport_speed (0.0) , _requested_return_frame (-1) , _under_nsm_control (false) - , _session_dir (new SessionDirectory(fullpath)) + , _session_dir (new SessionDirectory (fullpath)) , state_tree (0) - , _state_of_the_state (Clean) + , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading)) , _butler (new Butler (*this)) , _post_transport_work (0) , _send_timecode_update (false) @@ -154,6 +155,69 @@ Session::Session (AudioEngine &eng, , main_outs (0) , _have_rec_enabled_track (false) , _suspend_timecode_transmission (0) + , _non_soloed_outs_muted (false) + , _listen_cnt (0) + , _solo_isolated_cnt (0) + , _transport_speed (0) + , _default_transport_speed (1.0) + , _last_transport_speed (0) + , auto_play_legal (false) + , transport_sub_state (0) + , _transport_frame (0) + , _session_range_location (0) + , loop_changing (false) + , play_loop (false) + , have_looped (false) + , _last_roll_location (0) + , _last_roll_or_reversal_location (0) + , _last_record_location (0) + , pending_locate_frame (0) + , pending_locate_roll (false) + , pending_locate_flush (false) + , state_was_pending (false) + , outbound_mtc_timecode_frame (0) + , next_quarter_frame_to_send (-1) + , current_block_size (0) + , solo_update_disabled (false) + , _have_captured (false) + , _worst_output_latency (0) + , _worst_input_latency (0) + , _worst_track_latency (0) + , _was_seamless (Config->get_seamless_loop ()) + , _slave (0) + , _send_qf_mtc (false) + , _pframes_since_last_mtc (0) + , _play_range (false) + , _exporting (false) + , pending_abort (false) + , _adding_routes_in_progress (false) + , destructive_index (0) + , first_file_data_format_reset (true) + , first_file_header_format_reset (true) + , post_export_sync (false) + , midi_control_ui (0) + , _step_editors (0) + , no_questions_about_missing_files (false) + , _speakers (new Speakers) + , _clicks_cleared (0) + , ignore_route_processor_changes (false) + , _pre_export_mmc_enabled (false) + , _locations (new Locations (*this)) + , ltc_encoder (0) + , playlists (new SessionPlaylists) + , _name (snapshot_name) + , _current_snapshot_name (snapshot_name) + , step_speed (0.0) + , click_length (0) + , click_emphasis_length (0) + , _clicking (false) + , process_function (&Session::process_with_events) + , last_timecode_when (0) + , last_timecode_valid (false) + , average_slave_delta (1800) // !!! why 1800 ??? + , have_first_delta_accumulator (false) + , delta_accumulator_cnt (0) + , _slave_state (Stopped) { if (_engine.current_backend() == 0 || _engine.setup_required()) { boost::optional<int> r = AudioEngineSetupRequired (); @@ -166,39 +230,17 @@ Session::Session (AudioEngine &eng, throw failed_constructor(); } - _locations = new Locations (*this); - ltc_encoder = NULL; - - _midi_ports = new MidiPortManager; - _mmc = new MIDI::MachineControl; - - _mmc->set_ports (_midi_ports->mmc_input_port(), _midi_ports->mmc_output_port()); - - if (how_many_dsp_threads () > 1) { - /* For now, only create the graph if we are using >1 DSP threads, as - it is a bit slower than the old code with 1 thread. - */ - _process_graph.reset (new Graph (*this)); - } - - playlists.reset (new SessionPlaylists); - - _all_route_group->set_active (true, this); - - interpolation.add_channel_to (0, 0); - - n_physical_outputs = _engine.n_physical_outputs (); - n_physical_inputs = _engine.n_physical_inputs (); - first_stage_init (fullpath, snapshot_name); - _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); - if (_is_new) { if (create (mix_template, bus_profile)) { destroy (); throw failed_constructor (); } + } else { + if (load_state (_current_snapshot_name)) { + throw failed_constructor (); + } } if (second_stage_init ()) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index a7d7a0be4c..2491712c49 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -86,6 +86,7 @@ #include "ardour/control_protocol_manager.h" #include "ardour/directory_names.h" #include "ardour/filename_extensions.h" +#include "ardour/graph.h" #include "ardour/location.h" #include "ardour/midi_model.h" #include "ardour/midi_patch_manager.h" @@ -126,117 +127,20 @@ using namespace PBD; /** @param snapshot_name Snapshot name, without the .ardour prefix */ void -Session::first_stage_init (string fullpath, string snapshot_name) +Session::first_stage_init (string fullpath, string /*snapshot_name*/) { - if (fullpath.length() == 0) { - destroy (); - throw failed_constructor(); - } - - char buf[PATH_MAX+1]; - if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) { - error << string_compose(_("Could not use path %1 (%2)"), buf, strerror(errno)) << endmsg; - destroy (); - throw failed_constructor(); - } - - _path = string(buf); - - if (_path[_path.length()-1] != G_DIR_SEPARATOR) { - _path += G_DIR_SEPARATOR; - } - - /* these two are just provisional settings. set_state() - will likely override them. + /* finish initialization that can't be done in a normal C++ constructor + definition. */ - _name = _current_snapshot_name = snapshot_name; - - set_history_depth (Config->get_history_depth()); - - _current_frame_rate = _engine.sample_rate (); - _nominal_frame_rate = _current_frame_rate; - _base_frame_rate = _current_frame_rate; - - _tempo_map = new TempoMap (_current_frame_rate); - _tempo_map->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1)); - - - _non_soloed_outs_muted = false; - _listen_cnt = 0; - _solo_isolated_cnt = 0; + timerclear (&last_mmc_step); g_atomic_int_set (&processing_prohibited, 0); - _transport_speed = 0; - _default_transport_speed = 1.0; - _last_transport_speed = 0; - _target_transport_speed = 0; - auto_play_legal = false; - transport_sub_state = 0; - _transport_frame = 0; - _requested_return_frame = -1; - _session_range_location = 0; g_atomic_int_set (&_record_status, Disabled); - loop_changing = false; - play_loop = false; - have_looped = false; - _last_roll_location = 0; - _last_roll_or_reversal_location = 0; - _last_record_location = 0; - pending_locate_frame = 0; - pending_locate_roll = false; - pending_locate_flush = false; - state_was_pending = false; - set_next_event (); - outbound_mtc_timecode_frame = 0; - next_quarter_frame_to_send = -1; - current_block_size = 0; - solo_update_disabled = false; - _have_captured = false; - _worst_output_latency = 0; - _worst_input_latency = 0; - _worst_track_latency = 0; - _state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading); - _was_seamless = Config->get_seamless_loop (); - _slave = 0; - _send_qf_mtc = false; - _pframes_since_last_mtc = 0; g_atomic_int_set (&_playback_load, 100); g_atomic_int_set (&_capture_load, 100); - _play_range = false; - _exporting = false; - pending_abort = false; - _adding_routes_in_progress = false; - destructive_index = 0; - first_file_data_format_reset = true; - first_file_header_format_reset = true; - post_export_sync = false; - midi_control_ui = 0; - _step_editors = 0; - no_questions_about_missing_files = false; - _speakers.reset (new Speakers); - _clicks_cleared = 0; - ignore_route_processor_changes = false; - _pre_export_mmc_enabled = false; - - AudioDiskstream::allocate_working_buffers(); - - /* default short fade = 15ms */ - - SndFileSource::setup_standard_crossfades (*this, frame_rate()); - - last_mmc_step.tv_sec = 0; - last_mmc_step.tv_usec = 0; - step_speed = 0.0; - - /* click sounds are unset by default, which causes us to internal - waveforms for clicks. - */ - - click_length = 0; - click_emphasis_length = 0; - _clicking = false; - - process_function = &Session::process_with_events; + set_next_event (); + _all_route_group->set_active (true, this); + interpolation.add_channel_to (0, 0); if (config.get_use_video_sync()) { waiting_for_sync_offset = true; @@ -244,31 +148,51 @@ Session::first_stage_init (string fullpath, string snapshot_name) waiting_for_sync_offset = false; } - last_timecode_when = 0; - last_timecode_valid = false; - - sync_time_vars (); - last_rr_session_dir = session_dirs.begin(); - refresh_disk_space (); + + set_history_depth (Config->get_history_depth()); + + if (how_many_dsp_threads () > 1) { + /* For now, only create the graph if we are using >1 DSP threads, as + it is a bit slower than the old code with 1 thread. + */ + _process_graph.reset (new Graph (*this)); + } /* default: assume simple stereo speaker configuration */ _speakers->setup_default_speakers (2); - /* slave stuff */ - - average_slave_delta = 1800; // !!! why 1800 ???? - have_first_delta_accumulator = false; - delta_accumulator_cnt = 0; - _slave_state = Stopped; - _solo_cut_control.reset (new ProxyControllable (_("solo cut control (dB)"), PBD::Controllable::GainLike, boost::bind (&RCConfiguration::set_solo_mute_gain, Config, _1), boost::bind (&RCConfiguration::get_solo_mute_gain, Config))); add_controllable (_solo_cut_control); - _engine.GraphReordered.connect_same_thread (*this, boost::bind (&Session::graph_reordered, this)); + /* discover canonical fullpath */ + + if (fullpath.length() == 0) { + destroy (); + throw failed_constructor(); + } + + char buf[PATH_MAX+1]; + if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) { + error << string_compose(_("Could not use path %1 (%2)"), buf, strerror(errno)) << endmsg; + destroy (); + throw failed_constructor(); + } + + _path = string(buf); + + /* we require _path to end with a dir separator */ + + if (_path[_path.length()-1] != G_DIR_SEPARATOR) { + _path += G_DIR_SEPARATOR; + } + + /* is it new ? */ + + _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)); /* These are all static "per-class" signals */ @@ -282,6 +206,31 @@ Session::first_stage_init (string fullpath, string snapshot_name) Delivery::disable_panners (); IO::disable_connecting (); + + /* ENGINE */ + + n_physical_outputs = _engine.n_physical_outputs (); + n_physical_inputs = _engine.n_physical_inputs (); + + _current_frame_rate = _engine.sample_rate (); + _nominal_frame_rate = _current_frame_rate; + _base_frame_rate = _current_frame_rate; + + _midi_ports = new MidiPortManager; + _mmc = new MIDI::MachineControl; + + _mmc->set_ports (_midi_ports->mmc_input_port(), _midi_ports->mmc_output_port()); + + _tempo_map = new TempoMap (_current_frame_rate); + _tempo_map->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1)); + + AudioDiskstream::allocate_working_buffers(); + + SndFileSource::setup_standard_crossfades (*this, frame_rate()); + _engine.GraphReordered.connect_same_thread (*this, boost::bind (&Session::graph_reordered, this)); + + refresh_disk_space (); + sync_time_vars (); } int @@ -289,12 +238,6 @@ Session::second_stage_init () { AudioFileSource::set_peak_dir (_session_dir->peak_path()); - if (!_is_new) { - if (load_state (_current_snapshot_name)) { - return -1; - } - } - if (_butler->start_thread()) { return -1; } |