summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-09-09 22:40:54 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-09-09 22:40:54 -0400
commit19d05fa4366251cf1a4fcbe2b2a405b222f9533b (patch)
treeece7113888142b9ac1213a9d9f8a6bf73e22d0f3
parentbea54346391bcb575fbb2fc4d40d632dee125e05 (diff)
start reordering of Session initialization
the goal is to allow a clear demarcation of where we need the audioengine and have existing data parameters (e.g. sample rate) for the session so that we can coerce the engine (if possible) to match to session values. also, to rationalize construction even more and use C++ constructor syntax as much as possible.
-rw-r--r--libs/ardour/session.cc98
-rw-r--r--libs/ardour/session_state.cc191
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;
}