save and restore settings for different backend/driver/device combinations
So far, this is only internal - never saved to disk
This commit is contained in:
parent
8060198f75
commit
58dd0198e6
@ -195,25 +195,25 @@ ARDOUR_UI::install_actions ()
|
|||||||
act = ActionManager::register_action (engine_actions, X_("JACKDisconnect"), _("Disconnect"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::disconnect_from_jack));
|
act = ActionManager::register_action (engine_actions, X_("JACKDisconnect"), _("Disconnect"), sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::disconnect_from_jack));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
|
|
||||||
RadioAction::Group jack_latency_group;
|
RadioAction::Group latency_group;
|
||||||
|
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency32"), X_("32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 32));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency32"), X_("32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 32));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency64"), X_("64"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 64));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency64"), X_("64"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 64));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency128"), X_("128"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 128));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency128"), X_("128"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 128));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency256"), X_("256"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 256));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency256"), X_("256"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 256));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency512"), X_("512"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 512));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency512"), X_("512"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 512));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency1024"), X_("1024"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 1024));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency1024"), X_("1024"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 1024));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency2048"), X_("2048"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 2048));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency2048"), X_("2048"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 2048));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency4096"), X_("4096"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 4096));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency4096"), X_("4096"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 4096));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_radio_action (engine_actions, jack_latency_group, X_("JACKLatency8192"), X_("8192"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 8192));
|
act = ActionManager::register_radio_action (engine_actions, latency_group, X_("JACKLatency8192"), X_("8192"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 8192));
|
||||||
ActionManager::engine_sensitive_actions.push_back (act);
|
ActionManager::engine_sensitive_actions.push_back (act);
|
||||||
|
|
||||||
/* these actions are intended to be shared across all windows */
|
/* these actions are intended to be shared across all windows */
|
||||||
|
@ -128,11 +128,15 @@ EngineControl::EngineControl ()
|
|||||||
basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
|
sr_connection = sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
|
||||||
|
|
||||||
label = manage (left_aligned_label (_("Buffer size:")));
|
label = manage (left_aligned_label (_("Buffer size:")));
|
||||||
basic_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
row++;
|
row++;
|
||||||
|
|
||||||
|
bs_connection = buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
|
||||||
|
|
||||||
label = manage (left_aligned_label (_("Hardware input latency:")));
|
label = manage (left_aligned_label (_("Hardware input latency:")));
|
||||||
basic_packer.attach (*label, 0, 1, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (*label, 0, 1, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
basic_packer.attach (input_latency, 1, 2, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (input_latency, 1, 2, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
@ -147,8 +151,6 @@ EngineControl::EngineControl ()
|
|||||||
basic_packer.attach (*label, 2, 3, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
basic_packer.attach (*label, 2, 3, row, row+1, FILL|EXPAND, (AttachOptions) 0);
|
||||||
++row;
|
++row;
|
||||||
|
|
||||||
sr_connection = sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::reshow_buffer_sizes));
|
|
||||||
|
|
||||||
device_combo.set_size_request (250, -1);
|
device_combo.set_size_request (250, -1);
|
||||||
input_device_combo.set_size_request (250, -1);
|
input_device_combo.set_size_request (250, -1);
|
||||||
output_device_combo.set_size_request (250, -1);
|
output_device_combo.set_size_request (250, -1);
|
||||||
@ -207,6 +209,8 @@ EngineControl::backend_changed ()
|
|||||||
driver_combo.set_sensitive (false);
|
driver_combo.set_sensitive (false);
|
||||||
list_devices ();
|
list_devices ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maybe_set_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -255,6 +259,8 @@ EngineControl::driver_changed ()
|
|||||||
|
|
||||||
backend->set_driver (driver_combo.get_active_text());
|
backend->set_driver (driver_combo.get_active_text());
|
||||||
list_devices ();
|
list_devices ();
|
||||||
|
|
||||||
|
maybe_set_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -287,20 +293,78 @@ EngineControl::device_changed ()
|
|||||||
set_popdown_strings (sample_rate_combo, s);
|
set_popdown_strings (sample_rate_combo, s);
|
||||||
sample_rate_combo.set_active_text (s.front());
|
sample_rate_combo.set_active_text (s.front());
|
||||||
|
|
||||||
reshow_buffer_sizes ();
|
reshow_buffer_sizes (true);
|
||||||
|
|
||||||
sr_connection.unblock ();
|
sr_connection.unblock ();
|
||||||
|
|
||||||
|
maybe_set_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EngineControl::reshow_buffer_sizes ()
|
EngineControl::sample_rate_changed ()
|
||||||
|
{
|
||||||
|
bool existing = true;
|
||||||
|
State* state = get_current_state ();
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
existing = false;
|
||||||
|
state = new State;
|
||||||
|
state->backend = backend_combo.get_active_text ();
|
||||||
|
state->driver = driver_combo.get_active_text ();
|
||||||
|
state->device = device_combo.get_active_text ();
|
||||||
|
state->buffer_size = buffer_size_combo.get_active_text ();
|
||||||
|
}
|
||||||
|
|
||||||
|
state->sample_rate = sample_rate_combo.get_active_text ();
|
||||||
|
|
||||||
|
if (!existing) {
|
||||||
|
states.push_back (*state);
|
||||||
|
}
|
||||||
|
|
||||||
|
reshow_buffer_sizes (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EngineControl::buffer_size_changed ()
|
||||||
|
{
|
||||||
|
bool existing = true;
|
||||||
|
State* state = get_current_state ();
|
||||||
|
|
||||||
|
if (!state) {
|
||||||
|
existing = false;
|
||||||
|
state = new State;
|
||||||
|
state->backend = backend_combo.get_active_text ();
|
||||||
|
state->driver = driver_combo.get_active_text ();
|
||||||
|
state->device = device_combo.get_active_text ();
|
||||||
|
state->sample_rate = sample_rate_combo.get_active_text ();
|
||||||
|
}
|
||||||
|
|
||||||
|
state->buffer_size = buffer_size_combo.get_active_text ();
|
||||||
|
|
||||||
|
if (!existing) {
|
||||||
|
states.push_back (*state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EngineControl::reshow_buffer_sizes (bool size_choice_changed)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
|
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
|
||||||
assert (backend);
|
assert (backend);
|
||||||
string device_name = device_combo.get_active_text ();
|
string device_name = device_combo.get_active_text ();
|
||||||
vector<string> s;
|
vector<string> s;
|
||||||
|
int existing_size_choice = 0;
|
||||||
|
string new_target_string;
|
||||||
|
|
||||||
/* buffer sizes */
|
/* buffer sizes - convert from just samples to samples + msecs for
|
||||||
|
* the displayed string
|
||||||
|
*/
|
||||||
|
|
||||||
|
bs_connection.block ();
|
||||||
|
|
||||||
|
if (!size_choice_changed) {
|
||||||
|
sscanf (buffer_size_combo.get_active_text().c_str(), "%d", &existing_size_choice);
|
||||||
|
}
|
||||||
|
|
||||||
s.clear ();
|
s.clear ();
|
||||||
vector<uint32_t> bs = backend->available_buffer_sizes(device_name);
|
vector<uint32_t> bs = backend->available_buffer_sizes(device_name);
|
||||||
@ -308,17 +372,34 @@ EngineControl::reshow_buffer_sizes ()
|
|||||||
|
|
||||||
for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
|
for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
|
||||||
/* Translators: "samples" is ALWAYS plural here, so we do not
|
/* Translators: "samples" is ALWAYS plural here, so we do not
|
||||||
need singular form as well. Same for msecs.
|
need singular form as well. Same for msecs.
|
||||||
*/
|
*/
|
||||||
snprintf (buf, sizeof (buf), _("%u samples (%.1f msecs)"), *x, (2 * (*x)) / (rate/1000.0));
|
snprintf (buf, sizeof (buf), _("%u samples (%.1f msecs)"), *x, (2 * (*x)) / (rate/1000.0));
|
||||||
s.push_back (buf);
|
s.push_back (buf);
|
||||||
|
|
||||||
|
/* if this is the size previously chosen, this is the string we
|
||||||
|
* will want to be active in the combo.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (existing_size_choice == *x) {
|
||||||
|
new_target_string = buf;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_popdown_strings (buffer_size_combo, s);
|
set_popdown_strings (buffer_size_combo, s);
|
||||||
|
|
||||||
|
if (!new_target_string.empty()) {
|
||||||
|
buffer_size_combo.set_active_text (new_target_string);
|
||||||
|
} else {
|
||||||
buffer_size_combo.set_active_text (s.front());
|
buffer_size_combo.set_active_text (s.front());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bs_connection.unblock ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
EngineControl::audio_mode_changed ()
|
EngineControl::audio_mode_changed ()
|
||||||
{
|
{
|
||||||
@ -339,14 +420,52 @@ EngineControl::audio_mode_changed ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EngineStateKey
|
EngineControl::State*
|
||||||
|
EngineControl::get_matching_state (const string& backend,
|
||||||
|
const string& driver,
|
||||||
|
const string& device)
|
||||||
{
|
{
|
||||||
std::string system;
|
for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
|
||||||
std::string driver;
|
if ((*i).backend == backend &&
|
||||||
std::string device;
|
(*i).driver == driver &&
|
||||||
};
|
(*i).device == device) {
|
||||||
|
return &(*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
typedef std::map<EngineStateKey,XMLNode*> EngineStateMap;
|
EngineControl::State*
|
||||||
|
EngineControl::get_current_state ()
|
||||||
|
{
|
||||||
|
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
|
||||||
|
|
||||||
|
if (backend) {
|
||||||
|
return get_matching_state (backend_combo.get_active_text(),
|
||||||
|
(backend->requires_driver_selection() ? (std::string) driver_combo.get_active_text() : string()),
|
||||||
|
device_combo.get_active_text());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return get_matching_state (backend_combo.get_active_text(),
|
||||||
|
string(),
|
||||||
|
device_combo.get_active_text());
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EngineControl::maybe_set_state ()
|
||||||
|
{
|
||||||
|
State* state = get_current_state ();
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
sr_connection.block ();
|
||||||
|
bs_connection.block ();
|
||||||
|
sample_rate_combo.set_active_text (state->sample_rate);
|
||||||
|
buffer_size_combo.set_active_text (state->buffer_size);
|
||||||
|
bs_connection.unblock ();
|
||||||
|
sr_connection.unblock ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
EngineControl::get_state ()
|
EngineControl::get_state ()
|
||||||
|
@ -94,6 +94,7 @@ class EngineControl : public Gtk::VBox {
|
|||||||
Gtk::HBox midi_hbox;
|
Gtk::HBox midi_hbox;
|
||||||
|
|
||||||
sigc::connection sr_connection;
|
sigc::connection sr_connection;
|
||||||
|
sigc::connection bs_connection;
|
||||||
|
|
||||||
bool _used;
|
bool _used;
|
||||||
|
|
||||||
@ -101,6 +102,8 @@ class EngineControl : public Gtk::VBox {
|
|||||||
|
|
||||||
void driver_changed ();
|
void driver_changed ();
|
||||||
void backend_changed ();
|
void backend_changed ();
|
||||||
|
void sample_rate_changed ();
|
||||||
|
void buffer_size_changed ();
|
||||||
|
|
||||||
uint32_t get_rate() const;
|
uint32_t get_rate() const;
|
||||||
uint32_t get_buffer_size() const;
|
uint32_t get_buffer_size() const;
|
||||||
@ -114,7 +117,25 @@ class EngineControl : public Gtk::VBox {
|
|||||||
void audio_mode_changed ();
|
void audio_mode_changed ();
|
||||||
void device_changed ();
|
void device_changed ();
|
||||||
void list_devices ();
|
void list_devices ();
|
||||||
void reshow_buffer_sizes ();
|
void reshow_buffer_sizes (bool choice_changed);
|
||||||
|
|
||||||
|
struct State {
|
||||||
|
std::string backend;
|
||||||
|
std::string driver;
|
||||||
|
std::string device;
|
||||||
|
std::string sample_rate;
|
||||||
|
std::string buffer_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<State> StateList;
|
||||||
|
|
||||||
|
StateList states;
|
||||||
|
|
||||||
|
State* get_matching_state (const std::string& backend,
|
||||||
|
const std::string& driver,
|
||||||
|
const std::string& device);
|
||||||
|
State* get_current_state ();
|
||||||
|
void maybe_set_state ();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __gtk2_ardour_engine_dialog_h__ */
|
#endif /* __gtk2_ardour_engine_dialog_h__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user