26 #include <boost/scoped_ptr.hpp>
28 #include <gtkmm/messagedialog.h>
35 #include <gtkmm/alignment.h>
36 #include <gtkmm/stock.h>
37 #include <gtkmm/notebook.h>
68 static const char*
results_markup =
X_(
"<span weight=\"bold\" size=\"larger\">%1</span>");
74 , input_latency_adjustment (0, 0, 99999, 1)
75 , input_latency (input_latency_adjustment)
76 , output_latency_adjustment (0, 0, 99999, 1)
77 , output_latency (output_latency_adjustment)
78 , input_channels_adjustment (0, 0, 256, 1)
79 , input_channels (input_channels_adjustment)
80 , output_channels_adjustment (0, 0, 256, 1)
81 , output_channels (output_channels_adjustment)
82 , ports_adjustment (128, 8, 1024, 1, 16)
83 , ports_spinner (ports_adjustment)
84 , control_app_button (
_(
"Device Control Panel"))
85 , midi_devices_button (
_(
"Midi Device Setup"))
86 , lm_measure_label (
_(
"Measure"))
87 , lm_use_button (
_(
"Use results"))
88 , lm_back_button (
_(
"Back to settings ... (ignore results)"))
89 , lm_button_audio (
_(
"Calibrate Audio"))
91 , have_lm_results (false)
93 , midi_back_button (
_(
"Back to settings"))
95 , _desired_sample_rate (0)
96 , started_at_least_once (false)
97 , queue_device_changed (false)
99 using namespace Notebook_Helpers;
100 vector<string> backend_names;
102 AttachOptions xopt = AttachOptions (FILL|EXPAND);
105 set_name (
X_(
"AudioMIDISetup"));
111 if (backends.empty()) {
112 MessageDialog msg (
string_compose (
_(
"No audio/MIDI backends detected. %1 cannot run\n\n(This is a build/packaging/system error. It should never happen.)"), PROGRAM_NAME));
117 for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
118 backend_names.push_back ((*b)->name);
138 lm_title.set_markup (
string_compose (
"<span size=\"large\" weight=\"bold\">%1</span>",
_(
"Latency Measurement Tool")));
150 lm_preamble.set_markup (
_(
"<span weight=\"bold\">Turn down the volume on your audio equipment to a very low level.</span>"));
152 lm_table.attach (
lm_preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
155 Gtk::Label* preamble;
156 preamble = manage (
new Label);
157 preamble->set_width_chars (60);
158 preamble->set_line_wrap (
true);
159 preamble->set_markup (
_(
"Select two channels below and connect them using a cable."));
161 lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
164 label = manage (
new Label (
_(
"Output channel")));
165 lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
167 Gtk::Alignment* misc_align = manage (
new Alignment (0.0, 0.5));
169 lm_table.attach (*misc_align, 1, 3, row, row+1, xopt, (AttachOptions) 0);
172 label = manage (
new Label (
_(
"Input channel")));
173 lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
175 misc_align = manage (
new Alignment (0.0, 0.5));
177 lm_table.attach (*misc_align, 1, 3, row, row+1, FILL, (AttachOptions) 0);
180 xopt = AttachOptions(0);
196 if ((l = dynamic_cast<Gtk::Misc*>(
lm_use_button.get_child())) != 0) {
197 l->set_padding (10, 10);
200 if ((l = dynamic_cast<Gtk::Misc*>(
lm_back_button.get_child())) != 0) {
201 l->set_padding (10, 10);
204 preamble = manage (
new Label);
205 preamble->set_width_chars (60);
206 preamble->set_line_wrap (
true);
207 preamble->set_markup (
_(
"Once the channels are connected, click the \"Measure\" button."));
208 lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
211 preamble = manage (
new Label);
212 preamble->set_width_chars (60);
213 preamble->set_line_wrap (
true);
214 preamble->set_markup (
_(
"When satisfied with the results, click the \"Use results\" button."));
215 lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
220 lm_table.attach (
lm_results, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
234 midi_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (
notebook, &Gtk::Notebook::set_current_page), 0));
246 notebook.set_name (
"SettingsNotebook");
250 get_vbox()->set_border_width (12);
271 cancel_button = add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL);
272 apply_button = add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_APPLY);
273 ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
339 ArdourDialog::on_response (response_id);
341 switch (response_id) {
346 #ifdef PLATFORM_WINDOWS
368 case RESPONSE_DELETE_EVENT:
371 ev.type = GDK_BUTTON_PRESS;
385 AttachOptions xopt = AttachOptions (FILL|EXPAND);
397 basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0);
424 using namespace Notebook_Helpers;
426 vector<string> strings;
427 AttachOptions xopt = AttachOptions (FILL|EXPAND);
434 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
440 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
445 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
451 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
469 basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
482 basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
494 basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
497 basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0);
507 basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
510 basic_packer.attach (*label, 2, 3, row, row+1, SHRINK, (AttachOptions) 0);
518 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
530 using namespace Notebook_Helpers;
532 vector<string> strings;
533 AttachOptions xopt = AttachOptions (FILL|EXPAND);
535 const string msg =
string_compose (
_(
"The %1 audio backend was configured and started externally.\nThis limits your control over it."), backend->
name());
537 label = manage (
new Label);
538 label->set_markup (
string_compose (
"<span weight=\"bold\" foreground=\"red\">%1</span>", msg));
539 basic_packer.attach (*label, 0, 2, row, row + 1, xopt, (AttachOptions) 0);
544 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
551 basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
570 vector<string> empty;
580 vector<string> outputs;
581 vector<string> inputs;
588 MessageDialog msg (
_(
"Failed to start or connect to audio-engine.\n\nLatency calibration requires a working audio interface."));
593 else if (inputs.empty() || outputs.empty()) {
594 MessageDialog msg (
_(
"Your selected audio configuration is playback- or capture-only.\n\nLatency calibration requires playback and capture"));
630 if (backend ==
"JACK") {
667 AttachOptions xopt = AttachOptions (FILL|EXPAND);
674 l = manage (
new Label);
675 l->set_markup (
string_compose (
"<span size=\"large\" weight=\"bold\">%1</span>",
_(
"MIDI Devices")));
677 l->set_alignment (0.5, 0.5);
681 l = manage (
new Label (
_(
"Device"))); l->show (); l->set_alignment (0.5, 0.5);
683 l = manage (
new Label (
_(
"Hardware Latencies"))); l->show (); l->set_alignment (0.5, 0.5);
686 l = manage (
new Label (
_(
"Input"))); l->show (); l->set_alignment (0.5, 0.5);
688 l = manage (
new Label (
_(
"Output"))); l->show (); l->set_alignment (0.5, 0.5);
697 bool enabled = (*p)->enabled;
700 m->set_name (
"midi device");
701 m->set_can_focus (Gtk::CAN_FOCUS);
702 m->add_events (Gdk::BUTTON_RELEASE_MASK);
705 midi_device_table.attach (*m, 0, 1, row, row + 1, xopt, AttachOptions (0)); m->show ();
706 if ((*p)->name == focus) {
710 a = manage (
new Gtk::Adjustment (0, 0, 99999, 1));
711 s = manage (
new Gtk::SpinButton (*a));
712 a->set_value ((*p)->input_latency);
715 midi_device_table.attach (*s, 1, 2, row, row + 1, xopt, AttachOptions (0)); s->show ();
717 a = manage (
new Gtk::Adjustment (0, 0, 99999, 1));
718 s = manage (
new Gtk::SpinButton (*a));
719 a->set_value ((*p)->output_latency);
722 midi_device_table.attach (*s, 2, 3, row, row + 1, xopt, AttachOptions (0)); s->show ();
724 b = manage (
new Button (
_(
"Calibrate")));
727 midi_device_table.attach (*b, 3, 4, row, row + 1, xopt, AttachOptions (0)); b->show ();
760 if (!drivers.empty()) {
762 string current_driver;
766 if (current_driver ==
"") {
768 if (current_driver ==
"")
770 current_driver = drivers.front ();
791 if (midi_options.size() == 1) {
822 uint32_t cnt = (uint32_t) sb->get_value();
824 sb->set_text (
_(
"all available channels"));
827 snprintf (buf,
sizeof (buf),
"%d", cnt);
841 vector<ARDOUR::AudioBackend::DeviceStatus> all_devices = backend->
enumerate_devices ();
852 vector<string> available_devices;
854 for (vector<ARDOUR::AudioBackend::DeviceStatus>::const_iterator i = all_devices.begin(); i != all_devices.end(); ++i) {
855 available_devices.push_back (i->name);
858 if (!available_devices.empty()) {
863 string current_device, found_device;
865 if (current_device ==
"") {
871 for (vector<string>::const_iterator i = available_devices.begin(); i != available_devices.end(); ++i) {
872 if (*i == current_device)
873 found_device = current_device;
875 if (found_device ==
"")
878 current_device = available_devices.front ();
973 sr.push_back (8000.0
f);
974 sr.push_back (16000.0
f);
975 sr.push_back (32000.0
f);
976 sr.push_back (44100.0
f);
977 sr.push_back (48000.0
f);
978 sr.push_back (88200.0
f);
979 sr.push_back (96000.0
f);
980 sr.push_back (192000.0
f);
981 sr.push_back (384000.0
f);
984 for (vector<float>::const_iterator x = sr.begin(); x != sr.end(); ++x) {
995 if (desired.empty()) {
1007 vector<uint32_t> bs;
1019 bs.push_back (1024);
1020 bs.push_back (2048);
1021 bs.push_back (4096);
1022 bs.push_back (8192);
1025 for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
1063 snprintf (buf,
sizeof (buf),
"%u %s", sz,
P_(
"sample",
"samples", sz));
1093 uint32_t samples =
atoi (bs_text);
1114 snprintf (buf,
sizeof (buf),
_(
"(%.1f ms)"), (samples / (rate/1000.0
f)));
1130 std::vector<MidiDeviceSettings> new_devices;
1132 for (vector<ARDOUR::AudioBackend::DeviceStatus>::const_iterator i = midi_devices.begin(); i != midi_devices.end(); ++i) {
1134 if (i->available && !mds) {
1143 new_devices.push_back (ptr);
1144 }
else if (i->available) {
1145 new_devices.push_back (mds);
1164 const string& backend,
1165 const string& driver,
1166 const string& device)
1168 for (StateList::iterator i =
states.begin(); i !=
states.end(); ++i) {
1169 if ((*i)->backend == backend &&
1170 (!
_have_control || ((*i)->driver == driver && (*i)->device == device)))
1212 for (StateList::iterator i =
states.begin(); i !=
states.end();) {
1213 if ((*i)->backend == state->backend &&
1214 (*i)->driver == state->driver &&
1215 (*i)->device == state->device) {
1222 states.push_back (state);
1266 if (!state->midi_option.empty()) {
1282 for (StateList::const_iterator i =
states.begin(); i !=
states.end(); ++i) {
1291 node->
add_property (
"input-latency", (*i)->input_latency);
1292 node->
add_property (
"output-latency", (*i)->output_latency);
1293 node->
add_property (
"input-channels", (*i)->input_channels);
1294 node->
add_property (
"output-channels", (*i)->output_channels);
1295 node->
add_property (
"active", (*i)->active ?
"yes" :
"no");
1299 for (std::vector<MidiDeviceSettings>::const_iterator p = (*i)->midi_devices.begin(); p != (*i)->midi_devices.end(); ++p) {
1303 midi_device_stuff->
add_property (
X_(
"input-latency"), (*p)->input_latency);
1304 midi_device_stuff->
add_property (
X_(
"output-latency"), (*p)->output_latency);
1327 if (root.
name() !=
"AudioMIDISetup") {
1335 for (citer = clist.begin(); citer != clist.end(); ++citer) {
1339 if (child->
name() !=
"EngineStates") {
1345 for (cciter = cclist.begin(); cciter != cclist.end(); ++cciter) {
1348 grandchild = *cciter;
1350 if (grandchild->
name() !=
"State") {
1354 if ((prop = grandchild->
property (
"backend")) == 0) {
1357 state->backend = prop->
value ();
1359 if ((prop = grandchild->
property (
"driver")) == 0) {
1362 state->driver = prop->
value ();
1364 if ((prop = grandchild->
property (
"device")) == 0) {
1367 state->device = prop->
value ();
1369 if ((prop = grandchild->
property (
"sample-rate")) == 0) {
1372 state->sample_rate =
atof (prop->
value ());
1374 if ((prop = grandchild->
property (
"buffer-size")) == 0) {
1377 state->buffer_size =
atoi (prop->
value ());
1379 if ((prop = grandchild->
property (
"input-latency")) == 0) {
1382 state->input_latency =
atoi (prop->
value ());
1384 if ((prop = grandchild->
property (
"output-latency")) == 0) {
1387 state->output_latency =
atoi (prop->
value ());
1389 if ((prop = grandchild->
property (
"input-channels")) == 0) {
1392 state->input_channels =
atoi (prop->
value ());
1394 if ((prop = grandchild->
property (
"output-channels")) == 0) {
1397 state->output_channels =
atoi (prop->
value ());
1399 if ((prop = grandchild->
property (
"active")) == 0) {
1404 if ((prop = grandchild->
property (
"midi-option")) == 0) {
1407 state->midi_option = prop->
value ();
1409 state->midi_devices.clear();
1413 for (XMLNodeList::const_iterator n = mnc.begin(); n != mnc.end(); ++n) {
1414 if ((*n)->property (
X_(
"name")) == 0
1415 || (*n)->property (
X_(
"enabled")) == 0
1416 || (*n)->property (
X_(
"input-latency")) == 0
1417 || (*n)->property (
X_(
"output-latency")) == 0
1423 (*n)->property (
X_(
"name"))->value (),
1425 atoi ((*n)->property (
X_(
"input-latency"))->value ()),
1426 atoi ((*n)->property (
X_(
"output-latency"))->value ())
1428 state->midi_devices.push_back (ptr);
1436 for (StateList::iterator i =
states.begin(); i !=
states.end();) {
1437 if ((*i)->backend == state->backend &&
1438 (*i)->driver == state->driver &&
1439 (*i)->device == state->device) {
1447 states.push_back (state);
1455 vector<std::string> backend_names;
1457 for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator i = backends.begin(); i != backends.end(); ++i) {
1458 backend_names.push_back((*i)->name);
1460 for (StateList::iterator i =
states.begin(); i !=
states.end();) {
1461 if (std::find(backend_names.begin(), backend_names.end(), (*i)->backend) == backend_names.end()) {
1468 for (StateList::const_iterator i =
states.begin(); i !=
states.end(); ++i) {
1496 bool restart_required =
false;
1498 bool change_driver =
false;
1499 bool change_device =
false;
1500 bool change_rate =
false;
1501 bool change_bufsize =
false;
1502 bool change_latency =
false;
1503 bool change_channels =
false;
1504 bool change_midi =
false;
1517 change_driver =
true;
1522 change_device =
true;
1530 change_bufsize =
true;
1548 change_channels =
true;
1552 change_channels =
true;
1557 change_latency =
true;
1563 change_device =
true;
1565 change_driver =
true;
1568 change_bufsize =
true;
1569 change_channels =
true;
1570 change_latency =
true;
1582 change_bufsize =
true;
1586 change_bufsize =
true;
1611 if (change_bufsize) {
1629 if (change_driver || change_device || change_channels || change_latency ||
1633 restart_required =
true;
1635 restart_required =
false;
1640 if (!change_driver && !change_device && !change_channels && !change_latency && !change_midi) {
1648 restart_required =
true;
1653 restart_required =
true;
1659 if (restart_required) {
1694 if (change_latency) {
1727 if (start || (was_running && restart_required)) {
1756 for (StateList::iterator i =
states.begin(); i !=
states.end(); ++i) {
1757 (*i)->active =
false;
1764 state->active =
true;
1795 if (sscanf (txt.c_str(),
"%d", &samples) != 1) {
1796 fprintf(stderr,
"Find a trout and repeatedly slap the nearest C++ who throws exceptions without catching them.\n");
1797 fprintf(stderr,
"Ardour will likely crash now, giving you time to get the trout.\n");
1815 if (!backend)
return 0;
1826 if (!backend)
return 0;
1889 if (appname.empty()) {
1906 if (page_num == 0) {
1983 if (mtdm->
err () > 0.3) {
1991 if (sample_rate == 0) {
1997 int frames_total = mtdm->
del();
2000 snprintf (buf,
sizeof (buf),
"%s%d samples (%.3lf ms)\n%s%d samples (%.3lf ms)",
2001 _(
"Detected roundtrip latency: "),
2002 frames_total, frames_total * 1000.0
f/sample_rate,
2003 _(
"Systemic latency: "),
2004 extra, extra * 1000.0
f/sample_rate);
2008 if (mtdm->
err () > 0.2) {
2010 strcat (buf,
_(
"(signal detection error)"));
2016 strcat (buf,
_(
"(inverted - bad wiring)"));
2045 if (sample_rate == 0) {
2053 snprintf (buf,
sizeof (buf),
"%s%" PRId64
" samples (%.1lf ms) dev: %.2f[spl]\n%s%" PRId64
" samples (%.1lf ms)",
2054 _(
"Detected roundtrip latency: "),
2055 frames_total, frames_total * 1000.0
f / sample_rate, mididm->
deviation (),
2056 _(
"Systemic latency: "),
2057 extra, extra * 1000.0f / sample_rate);
2061 if (!mididm->
ok ()) {
2063 strcat (buf,
_(
"(averaging)"));
2069 strcat (buf,
_(
"(too large jitter)"));
2071 }
else if (mididm->
deviation () > 10.0) {
2073 strcat (buf,
_(
"(large jitter)"));
2082 }
else if (mididm->
processed () > 400) {
2162 one_way = std::max (0., one_way);
2176 if (
notebook.get_current_page() == 2) {
virtual std::string name() const =0
void midi_option_changed()
Gtk::Button * cancel_button
void setup_midi_tab_for_jack()
Gtk::Button control_app_button
int atoi(const string &s)
int reconnect_to_engine()
virtual std::string device_name() const =0
Gtk::ComboBoxText driver_combo
virtual uint32_t systemic_output_latency() const =0
virtual std::vector< float > available_sample_rates(const std::string &device) const =0
const std::string & value() const
virtual int set_midi_option(const std::string &option)=0
uint32_t get_input_latency() const
PBD::ScopedConnection running_connection
Gtk::ComboBoxText midi_option_combo
static const unsigned int latency_tab
virtual int set_input_channels(uint32_t)=0
sigc::connection latency_timeout
bool started_at_least_once
int start_latency_detection(bool)
bool check_audio_latency_measurement()
std::string get_device_name() const
Gtk::Button lm_measure_button
Gtk::ComboBoxText sample_rate_combo
static ARDOUR_UI * instance()
std::string get_backend() const
LIBGTKMM2EXT_API bool set_active_text_if_present(Gtk::ComboBoxText &, const std::string)
const std::string & name() const
boost::shared_ptr< AudioBackend > current_backend() const
Gtk::Adjustment input_channels_adjustment
virtual int set_device_name(const std::string &)=0
void on_switch_page(GtkNotebookPage *, guint page_num)
ArdourButton lm_button_audio
Gtk::SpinButton input_latency
virtual float sample_rate() const =0
LIBPBD_API Transmitter error
Gtk::ComboBoxText backend_combo
const XMLNodeList & children(const std::string &str=std::string()) const
Gtk::Table midi_device_table
PBD::Signal0< void > DeviceListChanged
std::string get_midi_option() const
std::ostream & endmsg(std::ostream &ostr)
virtual std::string driver_name() const
void build_no_control_notebook()
LIBGTKMM2EXT_API void set_popdown_strings(Gtk::ComboBoxText &, const std::vector< std::string > &)
std::string bufsize_as_string(uint32_t)
virtual int set_systemic_midi_output_latency(std::string const, uint32_t)=0
std::string get_driver() const
#define P_(Singular, Plural, HowMany)
virtual uint32_t default_buffer_size(const std::string &device) const
virtual bool midi_device_enabled(std::string const) const =0
void sample_rate_changed()
void set_desired_sample_rate(uint32_t)
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
static AudioEngine * instance()
uint32_t get_output_latency() const
virtual std::vector< uint32_t > available_buffer_sizes(const std::string &device) const =0
virtual int set_systemic_input_latency(uint32_t)=0
Gtk::SpinButton input_channels
virtual uint32_t systemic_midi_input_latency(std::string const) const =0
framecnt_t processed(void)
virtual int set_systemic_output_latency(uint32_t)=0
void set_latency_input_port(const std::string &)
std::list< XMLNode * > XMLNodeList
void get_physical_outputs(DataType type, std::vector< std::string > &)
virtual int set_output_channels(uint32_t)=0
void device_list_changed()
bool check_midi_latency_measurement()
virtual std::string control_app_name() const =0
framecnt_t sample_rate() const
static const char * results_markup
void calibrate_midi_latency(MidiDeviceSettings)
void end_latency_detection()
Gtk::Button * apply_button
void configure_midi_devices()
virtual std::vector< std::string > enumerate_drivers() const
bool on_delete_event(GdkEventAny *)
XMLProperty * property(const char *)
LIBARDOUR_API RCConfiguration * Config
virtual uint32_t input_channels() const =0
State get_matching_state(const std::string &backend, const std::string &driver, const std::string &device)
uint32_t get_buffer_size() const
Gtk::ComboBoxText lm_input_channel_combo
void setup_midi_tab_for_backend()
bool string_is_affirmative(const std::string &str)
void latency_button_clicked()
PBD::ScopedConnectionList stopped_connection
virtual int set_driver(const std::string &)
Gtk::Label lm_measure_label
void update_sensitivity()
std::string rate_as_string(float r)
virtual std::string midi_option() const =0
virtual int set_sample_rate(float)=0
LIBGTKMM2EXT_API Gtk::Label * left_aligned_label(std::string const &)
virtual int set_midi_device_enabled(std::string const, bool)=0
MidiDeviceSettings find_midi_device(std::string devicename) const
void set_latency_output_port(const std::string &)
virtual uint32_t systemic_input_latency() const =0
virtual uint32_t systemic_midi_output_latency(std::string const) const =0
Gtk::Button lm_back_button
uint32_t _desired_sample_rate
void calibrate_audio_latency()
LIBARDOUR_API XMLNode * find_named_node(const XMLNode &node, std::string name)
void connect_disconnect_click()
virtual std::vector< std::string > enumerate_midi_options() const =0
void manage_control_app_sensitivity()
void disable_latency_tab()
PBD::Signal0< void > Running
std::vector< MidiDeviceSettings > _midi_devices
LIBARDOUR_API RuntimeProfile * Profile
bool queue_device_changed
void control_app_button_clicked()
Gtk::Adjustment output_latency_adjustment
State get_saved_state_for_currently_displayed_backend_and_device()
virtual void launch_control_app()=0
XMLProperty * add_property(const char *name, const std::string &value)
void midi_device_enabled_toggled(ArdourButton *, MidiDeviceSettings)
void buffer_size_changed()
void build_full_control_notebook()
void maybe_display_saved_state()
Gtk::Button lm_use_button
virtual uint32_t output_channels() const =0
boost::shared_ptr< StateStruct > State
void add_child_nocopy(XMLNode &)
static bool print_channel_count(Gtk::SpinButton *)
bool setup_required() const
std::vector< const AudioBackendInfo * > available_backends() const
int push_state_to_backend(bool start)
Gtk::Label buffer_size_duration_label
void start_latency_detection()
bool _can_set_midi_latencies
virtual bool can_change_sample_rate_when_running() const =0
uint32_t get_input_channels() const
virtual std::vector< DeviceStatus > enumerate_devices() const =0
static const unsigned int midi_tab
XMLNode * extra_xml(const std::string &str, bool add_if_missing=false)
void midi_latency_adjustment_changed(Gtk::Adjustment *, MidiDeviceSettings, bool)
ArdourButton midi_devices_button
void set_state(const XMLNode &)
Gtk::ComboBoxText lm_output_channel_combo
Gtk::ComboBoxText device_combo
bool on_delete_event(GdkEventAny *)
void show_buffer_duration()
PBD::Signal1< void, const char * > Halted
PBD::Signal0< void > Stopped
void get_physical_inputs(DataType type, std::vector< std::string > &)
virtual int set_buffer_size(uint32_t)=0
int disconnect_from_engine()
virtual int set_systemic_midi_input_latency(std::string const, uint32_t)=0
void enable_latency_tab()
virtual bool requires_driver_selection() const
virtual uint32_t buffer_size() const =0
void use_latency_button_clicked()
virtual bool can_change_buffer_size_when_running() const =0
#define MISSING_INVALIDATOR
XMLNodeList::const_iterator XMLNodeConstIterator
virtual std::vector< DeviceStatus > enumerate_midi_devices() const =0
uint32_t get_output_channels() const
void stop_latency_detection()
Gtk::Button midi_back_button
Gtk::Button connect_disconnect_button
void refresh_midi_display(std::string focus="")
MidiDeviceSettings _measure_midi
Gtk::ComboBoxText buffer_size_combo
Gtk::SpinButton output_channels
virtual bool can_set_systemic_midi_latencies() const =0
Gtk::SpinButton output_latency
Gtk::Adjustment input_latency_adjustment
PBD::ScopedConnection devicelist_connection
Gtk::Adjustment output_channels_adjustment
sigc::connection lm_back_button_signal
uint32_t latency_signal_delay() const
std::string string_compose(const std::string &fmt, const T1 &o1)
LIBGTKMM2EXT_API void container_clear(Gtk::Container &)
double atof(const string &s)
virtual float default_sample_rate() const