expose count widgets for duplicate track dialog
[ardour.git] / gtk2_ardour / engine_dialog.cc
index 8799d6aa8ff2f411a68c9936d73b1efd35e70276..5e7d4f5a3ea956737843867463a88d5a81579162 100644 (file)
@@ -20,7 +20,6 @@
 #include <exception>
 #include <vector>
 #include <cmath>
-#include <fstream>
 #include <map>
 
 #include <boost/scoped_ptr.hpp>
@@ -187,7 +186,8 @@ EngineControl::EngineControl ()
        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);
 
@@ -408,42 +408,70 @@ EngineControl::on_show ()
        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();
        }
 }
 
@@ -561,7 +589,7 @@ EngineControl::build_full_control_notebook ()
                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);
@@ -574,7 +602,7 @@ EngineControl::build_full_control_notebook ()
                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);
@@ -699,7 +727,8 @@ EngineControl::enable_latency_tab ()
                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 ();
        }
 
@@ -987,6 +1016,11 @@ EngineControl::backend_changed ()
         */
        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 ();
        }
@@ -1018,7 +1052,7 @@ EngineControl::print_channel_count (Gtk::SpinButton* sb)
        if (ARDOUR::Profile->get_mixbus()) {
                return true;
        }
-       
+
        uint32_t cnt = (uint32_t) sb->get_value();
        if (cnt == 0) {
                sb->set_text (_("all available channels"));
@@ -1428,7 +1462,7 @@ EngineControl::device_changed ()
                        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);
@@ -1986,6 +2020,13 @@ EngineControl::set_current_state (const State& state)
        // 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");
@@ -2245,13 +2286,12 @@ EngineControl::push_state_to_backend (bool start)
 
        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;
@@ -2324,7 +2364,7 @@ EngineControl::push_state_to_backend (bool start)
        }
 
        if (start || (was_running && restart_required)) {
-               if (ARDOUR_UI::instance()->reconnect_to_engine()) {
+               if (ARDOUR::AudioEngine::instance()->start()) {
                        return -1;
                }
        }
@@ -2498,7 +2538,7 @@ EngineControl::start_stop_button_clicked ()
        if (ARDOUR::AudioEngine::instance()->running()) {
                ARDOUR::AudioEngine::instance()->stop ();
        } else {
-               push_state_to_backend (true);
+               start_engine ();
        }
 }
 
@@ -2563,7 +2603,7 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
 
                if (ARDOUR::AudioEngine::instance()->running()) {
                        // TODO - mark as 'stopped for latency
-                       ARDOUR_UI::instance()->disconnect_from_engine ();
+                       stop_engine ();
                }
 
                {
@@ -2776,6 +2816,13 @@ EngineControl::latency_button_clicked ()
        }
 }
 
+void
+EngineControl::latency_back_button_clicked ()
+{
+       ARDOUR::AudioEngine::instance()->stop(true);
+       notebook.set_current_page(0);
+}
+
 void
 EngineControl::use_latency_button_clicked ()
 {
@@ -2805,9 +2852,8 @@ EngineControl::use_latency_button_clicked ()
 
                /* back to settings page */
                notebook.set_current_page (0);
-}
        }
-
+}
 
 bool
 EngineControl::on_delete_event (GdkEventAny* ev)
@@ -2870,9 +2916,9 @@ void
 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 ();
        }
 }