13
0

remove responsibility for starting AudioEngine from Session

This commit is contained in:
Paul Davis 2019-10-11 10:25:08 -06:00
parent 1c672e5191
commit 789f08891b

View File

@ -322,8 +322,6 @@ Session::Session (AudioEngine &eng,
, _selection (new CoreSelection (*this)) , _selection (new CoreSelection (*this))
, _global_locate_pending (false) , _global_locate_pending (false)
{ {
uint32_t sr = 0;
created_with = string_compose ("%1 %2", PROGRAM_NAME, revision); created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
pthread_mutex_init (&_rt_emit_mutex, 0); pthread_mutex_init (&_rt_emit_mutex, 0);
@ -339,20 +337,13 @@ Session::Session (AudioEngine &eng,
setup_lua (); setup_lua ();
assert (AudioEngine::instance()->running());
immediately_post_engine ();
if (_is_new) { if (_is_new) {
Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION; Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
if (ensure_engine (sr, true)) {
destroy ();
throw SessionException (_("Cannot connect to audio/midi engine"));
}
// set samplerate for plugins added early
// e.g from templates or MB channelstrip
set_block_size (_engine.samples_per_cycle());
set_sample_rate (_engine.sample_rate());
if (create (mix_template, bus_profile)) { if (create (mix_template, bus_profile)) {
destroy (); destroy ();
throw SessionException (_("Session initialization failed")); throw SessionException (_("Session initialization failed"));
@ -388,27 +379,10 @@ Session::Session (AudioEngine &eng,
if (load_state (_current_snapshot_name)) { if (load_state (_current_snapshot_name)) {
throw SessionException (_("Failed to load state")); throw SessionException (_("Failed to load state"));
} }
/* try to get sample rate from XML state so that we
* can influence the SR if we set up the audio
* engine.
*/
if (state_tree) {
XMLProperty const * prop;
XMLNode const * root (state_tree->root());
if ((prop = root->property (X_("sample-rate"))) != 0) {
sr = atoi (prop->value());
}
}
if (ensure_engine (sr, false)) {
destroy ();
throw SessionException (_("Cannot connect to audio/midi engine"));
}
} }
int err = post_engine_init (); int err = post_engine_init ();
if (err) { if (err) {
destroy (); destroy ();
switch (err) { switch (err) {
@ -503,39 +477,6 @@ Session::init_name_id_counter (guint n)
g_atomic_int_set (&_name_id_counter, n); g_atomic_int_set (&_name_id_counter, n);
} }
int
Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
{
if (_engine.current_backend() == 0) {
/* backend is unknown ... */
boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
if (r.get_value_or (-1) != 0) {
return -1;
}
} else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
/* keep engine */
} else if (_engine.setup_required()) {
/* backend is known, but setup is needed */
boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
if (r.get_value_or (-1) != 0) {
return -1;
}
} else if (!_engine.running()) {
if (_engine.start()) {
return -1;
}
}
/* at this point the engine should be running */
if (!_engine.running()) {
return -1;
}
return immediately_post_engine ();
}
int int
Session::immediately_post_engine () Session::immediately_post_engine ()
{ {
@ -586,6 +527,11 @@ Session::immediately_post_engine ()
* can we do that? */ * can we do that? */
_engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this)); _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
// set samplerate for plugins added early
// e.g from templates or MB channelstrip
set_block_size (_engine.samples_per_cycle());
set_sample_rate (_engine.sample_rate());
return 0; return 0;
} }