#include <exception>
#include <vector>
#include <cmath>
-#include <fstream>
#include <map>
#include <boost/scoped_ptr.hpp>
lm_measure_button.add (lm_measure_label);
lm_measure_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::latency_button_clicked));
lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked));
- lm_back_button_signal = lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0));
+ lm_back_button_signal = lm_back_button.signal_clicked().connect(
+ sigc::mem_fun(*this, &EngineControl::latency_back_button_clicked));
lm_use_button.set_sensitive (false);
ok_button->grab_focus();
}
+bool
+EngineControl::start_engine ()
+{
+ if (push_state_to_backend(true) != 0) {
+ MessageDialog msg(*this,
+ ARDOUR::AudioEngine::instance()->get_last_backend_error());
+ msg.run();
+ return false;
+ }
+ return true;
+}
+
+bool
+EngineControl::stop_engine ()
+{
+ if (ARDOUR::AudioEngine::instance()->stop()) {
+ MessageDialog msg(*this,
+ ARDOUR::AudioEngine::instance()->get_last_backend_error());
+ msg.run();
+ return false;
+ }
+ return true;
+}
+
void
EngineControl::on_response (int response_id)
{
ArdourDialog::on_response (response_id);
switch (response_id) {
- case RESPONSE_OK:
- if (push_state_to_backend (true) != 0) {
- return;
- } else {
- hide ();
- }
+ case RESPONSE_OK:
+ if (!start_engine()) {
+ return;
+ } else {
+ hide();
+ }
#ifdef PLATFORM_WINDOWS
- // But if there's no session open, this can produce
- // a long gap when nothing appears to be happening.
- // Let's show the splash image while we're waiting.
- if ( !ARDOUR_COMMAND_LINE::no_splash ) {
- if ( ARDOUR_UI::instance() ) {
- if ( !ARDOUR_UI::instance()->session_loaded ) {
- ARDOUR_UI::instance()->show_splash();
- }
+ // But if there's no session open, this can produce
+ // a long gap when nothing appears to be happening.
+ // Let's show the splash image while we're waiting.
+ if (!ARDOUR_COMMAND_LINE::no_splash) {
+ if (ARDOUR_UI::instance()) {
+ if (!ARDOUR_UI::instance()->session_loaded) {
+ ARDOUR_UI::instance()->show_splash();
}
}
+ }
#endif
- break;
- case RESPONSE_DELETE_EVENT:
- {
- GdkEventButton ev;
- ev.type = GDK_BUTTON_PRESS;
- ev.button = 1;
- on_delete_event ((GdkEventAny*) &ev);
- break;
- }
- default:
- hide ();
+ break;
+ case RESPONSE_DELETE_EVENT: {
+ GdkEventButton ev;
+ ev.type = GDK_BUTTON_PRESS;
+ ev.button = 1;
+ on_delete_event((GdkEventAny*)&ev);
+ break;
+ }
+ case RESPONSE_CANCEL:
+ if (ARDOUR_UI::instance() && ARDOUR_UI::instance()->session_loaded) {
+ ARDOUR_UI::instance()->check_audioengine(*this);
+ }
+ // fall through
+ default:
+ hide();
}
}
basic_packer.attach (input_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0);
++row;
}
-
+
output_channels.set_name ("OutputChannels");
output_channels.set_flags (Gtk::CAN_FOCUS);
output_channels.set_digits (0);
basic_packer.attach (output_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0);
++row;
}
-
+
input_latency.set_name ("InputLatency");
input_latency.set_flags (Gtk::CAN_FOCUS);
input_latency.set_digits (0);
lm_back_button_signal = lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), midi_tab));
lm_preamble.hide ();
} else {
- lm_back_button_signal = lm_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0));
+ lm_back_button_signal = lm_back_button.signal_clicked().connect(
+ sigc::mem_fun(*this, &EngineControl::latency_back_button_clicked));
lm_preamble.show ();
}
*/
engine_stopped (); // set "active/inactive"
+ if (!_have_control) {
+ // set settings from backend that we do have control over
+ set_active_text_if_present (buffer_size_combo, bufsize_as_string (backend->buffer_size()));
+ }
+
if (!ignore_changes) {
maybe_display_saved_state ();
}
if (ARDOUR::Profile->get_mixbus()) {
return true;
}
-
+
uint32_t cnt = (uint32_t) sb->get_value();
if (cnt == 0) {
sb->set_text (_("all available channels"));
queue_device_changed = true;
}
}
-
+
//the device name must be set FIRST so ASIO can populate buffersizes and the control panel button
if (backend->use_separate_input_and_output_devices()) {
backend->set_input_device_name (device_name_in);
// do the right thing
backend_combo.set_active_text (state->backend);
+ if (!ARDOUR::AudioEngine::instance()->setup_required ()) {
+ backend_changed ();
+ // we don't have control don't restore state
+ return true;
+ }
+
+
if (!state->driver.empty ()) {
if (!backend->requires_driver_selection ()) {
DEBUG_ECONTROL ("Backend should require driver selection");
if (was_running) {
if (restart_required) {
- if (ARDOUR_UI::instance()->disconnect_from_engine ()) {
+ if (ARDOUR::AudioEngine::instance()->stop()) {
return -1;
}
}
}
-
if (change_driver && backend->set_driver (get_driver())) {
error << string_compose (_("Cannot set driver to %1"), get_driver()) << endmsg;
return -1;
}
if (start || (was_running && restart_required)) {
- if (ARDOUR_UI::instance()->reconnect_to_engine()) {
+ if (ARDOUR::AudioEngine::instance()->start()) {
return -1;
}
}
if (ARDOUR::AudioEngine::instance()->running()) {
ARDOUR::AudioEngine::instance()->stop ();
} else {
- push_state_to_backend (true);
+ start_engine ();
}
}
if (ARDOUR::AudioEngine::instance()->running()) {
// TODO - mark as 'stopped for latency
- ARDOUR_UI::instance()->disconnect_from_engine ();
+ stop_engine ();
}
{
}
}
+void
+EngineControl::latency_back_button_clicked ()
+{
+ ARDOUR::AudioEngine::instance()->stop(true);
+ notebook.set_current_page(0);
+}
+
void
EngineControl::use_latency_button_clicked ()
{
/* back to settings page */
notebook.set_current_page (0);
-}
}
-
+}
bool
EngineControl::on_delete_event (GdkEventAny* ev)
EngineControl::connect_disconnect_click()
{
if (ARDOUR::AudioEngine::instance()->running()) {
- ARDOUR_UI::instance()->disconnect_from_engine ();
+ stop_engine ();
} else {
- ARDOUR_UI::instance()->reconnect_to_engine ();
+ start_engine ();
}
}