Remove old code to remove duplicate engine state which was used to
work-around a bug since 3.x saved duplicates but broke with 4.x separate
i/o devices.
Add a new variant to purge old unused states per backend (after sorting).
string_compose uses std::ostream/stringstream which will insert thousands
separators in some locales. This was not a problem when LocaleGuard set the
global C++ locale to "C"
A Dialog Window may not be tightly scoped, and may be around
for a while (query settings from the dialog instance). The destructor
may only be called later.
This should really be split in separate semantics for key and button events.
Fixes a subtle but nasty bug in the EngineDialog where the change of the default focus
widget from a Gtk::Button (acts on press) to an ArdourButton (acts on release) caused
events occuring after a dialog has grabbed focus to trigger button clicks
When there's no main window (initial setup, no transient parent),
preset a normal window listed in the task-bar.
The duality the Engine Dialog being used as Ardour-WM managed non-modal
Window (Menu > A/M Setup) and modal Dialog (AudioEngineSetupRequired)
complicates this a bit.
OK -> start_engine() can eg. trigger an interactive plugin scan,
which in turn leaves the EngineDialog responsive. changing settings
or clicking OK again can lead to undefined behavior.
It may happen that during push_state_to_backend() a device is
reconfigured in a way that triggers a "Device Changed" callback before
the engine is started. This callback can trigger a change to the
configuration that will be used when the engine is actually started.
This has been seen on OSX in conjunction with Aggregate Devices
(even if the aggregate is not used, but the device which is used
is also part of an aggregate)
example: HW changed callback arrives, device-list is re-populated,
*A*irplay" is at the top of the list, Airplay supports only 44.1K,
Samplerate changes... later save also writes this new rate to the file.