Add button to Engine Dialog to choose between Portaudio callback and blocking API

This commit is contained in:
Tim Mayberry 2016-02-05 23:32:59 +10:00
parent 85b4acc916
commit 2b4ac72e5d
2 changed files with 60 additions and 0 deletions

View file

@ -87,6 +87,7 @@ EngineControl::EngineControl ()
, midi_devices_button (_("Midi Device Setup")) , midi_devices_button (_("Midi Device Setup"))
, start_stop_button (_("Stop")) , start_stop_button (_("Stop"))
, update_devices_button (_("Refresh Devices")) , update_devices_button (_("Refresh Devices"))
, use_buffered_io_button (_("Use Buffered I/O"), ArdourButton::led_default_elements)
, lm_measure_label (_("Measure")) , lm_measure_label (_("Measure"))
, lm_use_button (_("Use results")) , lm_use_button (_("Use results"))
, lm_back_button (_("Back to settings ... (ignore results)")) , lm_back_button (_("Back to settings ... (ignore results)"))
@ -281,6 +282,11 @@ EngineControl::EngineControl ()
update_devices_button.set_name ("generic button"); update_devices_button.set_name ("generic button");
update_devices_button.set_can_focus(true); update_devices_button.set_can_focus(true);
use_buffered_io_button.signal_clicked.connect (mem_fun (*this, &EngineControl::use_buffered_io_button_clicked));
use_buffered_io_button.set_sensitive (false);
use_buffered_io_button.set_name ("generic button");
use_buffered_io_button.set_can_focus(true);
cancel_button = add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL); cancel_button = add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL);
ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
@ -503,6 +509,7 @@ EngineControl::build_notebook ()
basic_packer.attach (start_stop_button, 3, 4, 0, 1, xopt, xopt); basic_packer.attach (start_stop_button, 3, 4, 0, 1, xopt, xopt);
basic_packer.attach (update_devices_button, 3, 4, 1, 2, xopt, xopt); basic_packer.attach (update_devices_button, 3, 4, 1, 2, xopt, xopt);
basic_packer.attach (use_buffered_io_button, 3, 4, 2, 3, xopt, xopt);
lm_button_audio.signal_clicked.connect (sigc::mem_fun (*this, &EngineControl::calibrate_audio_latency)); lm_button_audio.signal_clicked.connect (sigc::mem_fun (*this, &EngineControl::calibrate_audio_latency));
lm_button_audio.set_name ("generic button"); lm_button_audio.set_name ("generic button");
@ -854,14 +861,21 @@ EngineControl::update_sensitivity ()
if (ARDOUR::AudioEngine::instance()->running()) { if (ARDOUR::AudioEngine::instance()->running()) {
start_stop_button.set_text("Stop"); start_stop_button.set_text("Stop");
update_devices_button.set_sensitive(false); update_devices_button.set_sensitive(false);
use_buffered_io_button.set_sensitive(false);
} else { } else {
if (backend->can_request_update_devices()) { if (backend->can_request_update_devices()) {
update_devices_button.show(); update_devices_button.show();
} else { } else {
update_devices_button.hide(); update_devices_button.hide();
} }
if (backend->can_use_buffered_io()) {
use_buffered_io_button.show();
} else {
use_buffered_io_button.hide();
}
start_stop_button.set_text("Start"); start_stop_button.set_text("Start");
update_devices_button.set_sensitive(true); update_devices_button.set_sensitive(true);
use_buffered_io_button.set_sensitive(true);
} }
} else { } else {
update_devices_button.set_sensitive(false); update_devices_button.set_sensitive(false);
@ -1823,6 +1837,7 @@ EngineControl::store_state (State state)
state->output_channels = get_output_channels (); state->output_channels = get_output_channels ();
state->midi_option = get_midi_option (); state->midi_option = get_midi_option ();
state->midi_devices = _midi_devices; state->midi_devices = _midi_devices;
state->use_buffered_io = get_use_buffered_io ();
state->lru = time (NULL) ; state->lru = time (NULL) ;
} }
@ -1852,6 +1867,8 @@ EngineControl::maybe_display_saved_state ()
input_latency.set_value (state->input_latency); input_latency.set_value (state->input_latency);
output_latency.set_value (state->output_latency); output_latency.set_value (state->output_latency);
use_buffered_io_button.set_active (state->use_buffered_io);
if (!state->midi_option.empty()) { if (!state->midi_option.empty()) {
midi_option_combo.set_active_text (state->midi_option); midi_option_combo.set_active_text (state->midi_option);
_midi_devices = state->midi_devices; _midi_devices = state->midi_devices;
@ -1889,6 +1906,7 @@ EngineControl::get_state ()
node->add_property ("input-channels", (*i)->input_channels); node->add_property ("input-channels", (*i)->input_channels);
node->add_property ("output-channels", (*i)->output_channels); node->add_property ("output-channels", (*i)->output_channels);
node->add_property ("active", (*i)->active ? "yes" : "no"); node->add_property ("active", (*i)->active ? "yes" : "no");
node->add_property ("use-buffered-io", (*i)->use_buffered_io ? "yes" : "no");
node->add_property ("midi-option", (*i)->midi_option); node->add_property ("midi-option", (*i)->midi_option);
node->add_property ("lru", (*i)->active ? time (NULL) : (*i)->lru); node->add_property ("lru", (*i)->active ? time (NULL) : (*i)->lru);
@ -2033,6 +2051,11 @@ EngineControl::set_state (const XMLNode& root)
} }
state->active = string_is_affirmative (prop->value ()); state->active = string_is_affirmative (prop->value ());
if ((prop = grandchild->property ("use-buffered-io")) == 0) {
continue;
}
state->use_buffered_io = string_is_affirmative (prop->value ());
if ((prop = grandchild->property ("midi-option")) == 0) { if ((prop = grandchild->property ("midi-option")) == 0) {
continue; continue;
} }
@ -2206,6 +2229,7 @@ EngineControl::set_current_state (const State& state)
input_latency.set_value (state->input_latency); input_latency.set_value (state->input_latency);
output_latency.set_value (state->output_latency); output_latency.set_value (state->output_latency);
midi_option_combo.set_active_text (state->midi_option); midi_option_combo.set_active_text (state->midi_option);
use_buffered_io_button.set_active (state->use_buffered_io);
return true; return true;
} }
@ -2232,6 +2256,7 @@ EngineControl::push_state_to_backend (bool start)
bool change_latency = false; bool change_latency = false;
bool change_channels = false; bool change_channels = false;
bool change_midi = false; bool change_midi = false;
bool change_buffered_io = false;
uint32_t ochan = get_output_channels (); uint32_t ochan = get_output_channels ();
uint32_t ichan = get_input_channels (); uint32_t ichan = get_input_channels ();
@ -2282,6 +2307,12 @@ EngineControl::push_state_to_backend (bool start)
change_midi = true; change_midi = true;
} }
if (backend->can_use_buffered_io()) {
if (get_use_buffered_io() != backend->get_use_buffered_io()) {
change_buffered_io = true;
}
}
/* zero-requested channels means "all available" */ /* zero-requested channels means "all available" */
if (ichan == 0) { if (ichan == 0) {
@ -2451,6 +2482,10 @@ EngineControl::push_state_to_backend (bool start)
backend->set_midi_option (get_midi_option()); backend->set_midi_option (get_midi_option());
} }
if (change_buffered_io) {
backend->set_use_buffered_io (use_buffered_io_button.get_active());
}
if (1 /* TODO */) { if (1 /* TODO */) {
for (vector<MidiDeviceSettings>::const_iterator p = _midi_devices.begin(); p != _midi_devices.end(); ++p) { for (vector<MidiDeviceSettings>::const_iterator p = _midi_devices.begin(); p != _midi_devices.end(); ++p) {
if (_measure_midi) { if (_measure_midi) {
@ -2565,6 +2600,12 @@ EngineControl::get_midi_option () const
return midi_option_combo.get_active_text(); return midi_option_combo.get_active_text();
} }
bool
EngineControl::get_use_buffered_io () const
{
return use_buffered_io_button.get_active();
}
uint32_t uint32_t
EngineControl::get_input_channels() const EngineControl::get_input_channels() const
{ {
@ -2675,6 +2716,20 @@ EngineControl::update_devices_button_clicked ()
} }
} }
void
EngineControl::use_buffered_io_button_clicked ()
{
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
if (!backend) {
return;
}
bool set_buffered_io = !use_buffered_io_button.get_active();
use_buffered_io_button.set_active (set_buffered_io);
backend->set_use_buffered_io (set_buffered_io);
}
void void
EngineControl::manage_control_app_sensitivity () EngineControl::manage_control_app_sensitivity ()
{ {

View file

@ -87,6 +87,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
ArdourButton midi_devices_button; ArdourButton midi_devices_button;
ArdourButton start_stop_button; ArdourButton start_stop_button;
ArdourButton update_devices_button; ArdourButton update_devices_button;
ArdourButton use_buffered_io_button;
Gtk::Button connect_disconnect_button; Gtk::Button connect_disconnect_button;
@ -162,6 +163,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
std::string get_driver() const; std::string get_driver() const;
std::string get_backend() const; std::string get_backend() const;
std::string get_midi_option () const; std::string get_midi_option () const;
bool get_use_buffered_io () const;
std::string get_default_device (const std::string&, std::string get_default_device (const std::string&,
const std::vector<std::string>&); const std::vector<std::string>&);
@ -222,6 +224,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
uint32_t input_channels; uint32_t input_channels;
uint32_t output_channels; uint32_t output_channels;
bool active; bool active;
bool use_buffered_io;
std::string midi_option; std::string midi_option;
std::vector<MidiDeviceSettings> midi_devices; std::vector<MidiDeviceSettings> midi_devices;
time_t lru; time_t lru;
@ -234,6 +237,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
, input_channels (0) , input_channels (0)
, output_channels (0) , output_channels (0)
, active (false) , active (false)
, use_buffered_io (false)
, lru (0) {} , lru (0) {}
}; };
@ -306,6 +310,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void control_app_button_clicked (); void control_app_button_clicked ();
void start_stop_button_clicked (); void start_stop_button_clicked ();
void update_devices_button_clicked (); void update_devices_button_clicked ();
void use_buffered_io_button_clicked ();
void use_latency_button_clicked (); void use_latency_button_clicked ();
void manage_control_app_sensitivity (); void manage_control_app_sensitivity ();
int push_state_to_backend (bool start); int push_state_to_backend (bool start);