more session construction order changes, and removal of n_physical_{inputs,outputs} members which were (a) not initialized early enough (b) not used anywhere except monitor bus connection.

Things almost make sense now.
This commit is contained in:
Paul Davis 2013-09-16 12:08:19 -04:00
parent ed61a9ebbd
commit 39ee88b3f9
3 changed files with 81 additions and 98 deletions

View File

@ -1071,7 +1071,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
boost::scoped_ptr<SessionDirectory> _session_dir;
void hookup_io ();
int when_engine_running ();
void graph_reordered ();
/** current snapshot name, without the .ardour suffix */
@ -1137,8 +1136,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void auto_loop_changed (Location *);
void auto_loop_declick_range (Location *, framepos_t &, framepos_t &);
int ensure_engine (uint32_t desired_sample_rate);
void pre_engine_init (std::string path);
int post_engine_init ();
int immediately_post_engine ();
void remove_empty_sounds ();
void setup_midi_control ();
@ -1521,13 +1522,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
float opt
);
/* number of hardware ports we're using,
based on max (requested,available)
*/
ChanCount n_physical_outputs;
ChanCount n_physical_inputs;
int find_all_sources (std::string path, std::set<std::string>& result);
int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
@ -1624,7 +1618,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void setup_ltc ();
void setup_click ();
void setup_bundles ();
int ensure_engine (uint32_t desired_sample_rate);
};
} // namespace ARDOUR

View File

@ -370,14 +370,18 @@ Session::ensure_engine (uint32_t desired_sample_rate)
return -1;
}
/* the graph is just about as basic to everything else as the engine
so we create it here. this results in it coming into being at just
the right time for both new and existing sessions.
return immediately_post_engine ();
XXX some cleanup in the new/existing path is still waiting to be
done
*/
}
int
Session::immediately_post_engine ()
{
/* Do various initializations that should take place directly after we
* know that the engine is running, but before we either create a
* session or set state for an existing one.
*/
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.
@ -385,6 +389,31 @@ Session::ensure_engine (uint32_t desired_sample_rate)
_process_graph.reset (new Graph (*this));
}
/* every time we reconnect, recompute worst case output latencies */
_engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
if (synced_to_jack()) {
_engine.transport_stop ();
}
if (config.get_jack_time_master()) {
_engine.transport_locate (_transport_frame);
}
try {
BootMessage (_("Set up LTC"));
setup_ltc ();
BootMessage (_("Set up Click"));
setup_click ();
BootMessage (_("Set up standard connections"));
setup_bundles ();
}
catch (failed_constructor& err) {
return -1;
}
return 0;
}
@ -707,81 +736,6 @@ Session::setup_bundles ()
}
int
Session::when_engine_running ()
{
/* every time we reconnect, recompute worst case output latencies */
_engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
if (synced_to_jack()) {
_engine.transport_stop ();
}
if (config.get_jack_time_master()) {
_engine.transport_locate (_transport_frame);
}
try {
BootMessage (_("Set up LTC"));
setup_ltc ();
BootMessage (_("Set up Click"));
setup_click ();
BootMessage (_("Set up standard connections"));
setup_bundles ();
}
catch (failed_constructor& err) {
return -1;
}
BootMessage (_("Setup signal flow and plugins"));
/* Reset all panners */
Delivery::reset_panners ();
/* this will cause the CPM to instantiate any protocols that are in use
* (or mandatory), which will pass it this Session, and then call
* set_state() on each instantiated protocol to match stored state.
*/
ControlProtocolManager::instance().set_session (this);
/* This must be done after the ControlProtocolManager set_session above,
as it will set states for ports which the ControlProtocolManager creates.
*/
// XXX set state of MIDI::Port's
// MidiPortManager::instance()->set_port_states (Config->midi_port_states ());
/* And this must be done after the MIDI::Manager::set_port_states as
* it will try to make connections whose details are loaded by set_port_states.
*/
hookup_io ();
/* Let control protocols know that we are now all connected, so they
* could start talking to surfaces if they want to.
*/
ControlProtocolManager::instance().midi_connectivity_established ();
if (_is_new && !no_auto_connect()) {
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
auto_connect_master_bus ();
}
_state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
/* update latencies */
initialize_latencies ();
return 0;
}
void
Session::auto_connect_master_bus ()
{
@ -941,14 +895,14 @@ Session::add_monitor_section ()
/* Monitor bus is audio only */
uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
vector<string> outputs[DataType::num_types];
for (uint32_t i = 0; i < DataType::num_types; ++i) {
_engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
}
uint32_t mod = outputs[DataType::AUDIO].size();
uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
if (mod != 0) {

View File

@ -210,9 +210,6 @@ Session::post_engine_init ()
set_block_size (_engine.samples_per_cycle());
set_frame_rate (_engine.sample_rate());
n_physical_outputs = _engine.n_physical_outputs ();
n_physical_inputs = _engine.n_physical_inputs ();
BootMessage (_("Using configuration"));
_midi_ports = new MidiPortManager;
@ -273,8 +270,47 @@ Session::post_engine_init ()
Config->map_parameters (ff);
config.map_parameters (ft);
when_engine_running ();
/* Reset all panners */
Delivery::reset_panners ();
/* this will cause the CPM to instantiate any protocols that are in use
* (or mandatory), which will pass it this Session, and then call
* set_state() on each instantiated protocol to match stored state.
*/
ControlProtocolManager::instance().set_session (this);
/* This must be done after the ControlProtocolManager set_session above,
as it will set states for ports which the ControlProtocolManager creates.
*/
// XXX set state of MIDI::Port's
// MidiPortManager::instance()->set_port_states (Config->midi_port_states ());
/* And this must be done after the MIDI::Manager::set_port_states as
* it will try to make connections whose details are loaded by set_port_states.
*/
hookup_io ();
/* Let control protocols know that we are now all connected, so they
* could start talking to surfaces if they want to.
*/
ControlProtocolManager::instance().midi_connectivity_established ();
if (_is_new && !no_auto_connect()) {
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
auto_connect_master_bus ();
}
_state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
/* update latencies */
initialize_latencies ();
_locations->changed.connect_same_thread (*this, boost::bind (&Session::locations_changed, this));
_locations->added.connect_same_thread (*this, boost::bind (&Session::locations_added, this, _1));