Fix crash when closing session, recursive mon-section removal
[ardour.git] / gtk2_ardour / port_insert_ui.cc
index 5546fd533b53223aaba6e619eee1eec40cf5ce48..ffe2d34f069b297e599e3cd21da4f6fb7d219c5d 100644 (file)
 
 */
 
-#include <gtkmm/messagedialog.h>
 #include <glibmm/objectbase.h>
 
-#include <gtkmm2ext/doi.h>
+#include <gtkmm/messagedialog.h>
+#include <gtkmm/stock.h>
 
-#include "ardour/port_insert.h"
-#include "ardour/session.h"
-#include "ardour/io.h"
 #include "ardour/audioengine.h"
-#include "ardour/track.h"
-#include "ardour/audio_track.h"
-#include "ardour/midi_track.h"
 #include "ardour/mtdm.h"
-#include "ardour/data_type.h"
-#include "ardour/port.h"
-#include "ardour/bundle.h"
+#include "ardour/port_insert.h"
+#include "ardour/session.h"
+
+#include "gtkmm2ext/doi.h"
 
 #include "port_insert_ui.h"
-#include "utils.h"
 #include "gui_thread.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace Gtk;
 
 PortInsertUI::PortInsertUI (Gtk::Window* parent, ARDOUR::Session* sess, boost::shared_ptr<ARDOUR::PortInsert> pi)
-        : _pi (pi)
-        , latency_button (_("Measure Latency"))
-        , input_selector (parent, sess, pi->input())
-        , output_selector (parent, sess, pi->output())
+       : _pi (pi)
+       , latency_button (_("Measure Latency"))
+       , input_selector (parent, sess, pi->input())
+       , output_selector (parent, sess, pi->output())
 {
-        latency_hbox.pack_start (latency_button, false, false);
-        latency_hbox.pack_start (latency_display, false, false);
+       latency_hbox.pack_start (latency_button, false, false);
+       latency_hbox.pack_start (latency_display, false, false);
+       latency_hbox.set_spacing (4);
 
        output_selector.set_min_height_divisor (2);
        input_selector.set_min_height_divisor (2);
 
-        notebook.append_page (output_selector, _("Send/Output"));
-        notebook.append_page (input_selector, _("Return/Input"));
+       notebook.append_page (output_selector, _("Send/Output"));
+       notebook.append_page (input_selector, _("Return/Input"));
 
-        notebook.set_current_page (0);
-        
-        set_spacing (12);
-        pack_start (notebook, true, true);
-        pack_start (latency_hbox, false, false);
+       notebook.set_current_page (0);
 
-        update_latency_display ();
+       set_spacing (12);
+       pack_start (notebook, true, true);
+       pack_start (latency_hbox, false, false);
 
-        latency_button.signal_toggled().connect (mem_fun (*this, &PortInsertUI::latency_button_toggled));
+       update_latency_display ();
+
+       latency_button.signal_toggled().connect (mem_fun (*this, &PortInsertUI::latency_button_toggled));
+       latency_button.set_name (X_("MeasureLatencyButton"));
 }
 
 void
 PortInsertUI::update_latency_display ()
 {
-        framecnt_t const sample_rate = input_selector.session()->engine().frame_rate();
-        if (sample_rate == 0) {
-                latency_display.set_text (_("Disconnected from audio engine"));
-        } else {
-                char buf[64];
-                snprintf (buf, sizeof (buf), "%10.3lf frames %10.3lf ms", 
-                          (float)_pi->latency(), (float)_pi->latency() * 1000.0f/sample_rate);
-                latency_display.set_text(buf);
-        }
+       samplecnt_t const sample_rate = AudioEngine::instance()->sample_rate();
+       if (sample_rate == 0) {
+               latency_display.set_text (_("Disconnected from audio engine"));
+       } else {
+               char buf[64];
+               snprintf (buf, sizeof (buf), "%10.3lf samples %10.3lf ms",
+                         (float)_pi->latency(), (float)_pi->latency() * 1000.0f/sample_rate);
+               latency_display.set_text(buf);
+       }
 }
 
 bool
 PortInsertUI::check_latency_measurement ()
 {
-        MTDM* mtdm = _pi->mtdm ();
+       MTDM* mtdm = _pi->mtdm ();
 
-        if (mtdm->resolve () < 0) {
-                latency_display.set_text (_("No signal detected"));
-                return true;
-        }
+       if (mtdm->resolve () < 0) {
+               latency_display.set_text (_("No signal detected"));
+               return true;
+       }
 
-        if (mtdm->err () > 0.3) {
-                mtdm->invert ();
-                mtdm->resolve ();
-        }
+       if (mtdm->err () > 0.3) {
+               mtdm->invert ();
+               mtdm->resolve ();
+       }
 
-        char buf[128];
-        framecnt_t const sample_rate = AudioEngine::instance()->frame_rate();
+       char buf[128];
+       samplecnt_t const sample_rate = AudioEngine::instance()->sample_rate();
 
-        if (sample_rate == 0) {
-                latency_display.set_text (_("Disconnected from audio engine"));
-                _pi->stop_latency_detection ();
-                return false;
-        }
+       if (sample_rate == 0) {
+               latency_display.set_text (_("Disconnected from audio engine"));
+               _pi->stop_latency_detection ();
+               return false;
+       }
 
-        snprintf (buf, sizeof (buf), "%10.3lf frames %10.3lf ms", mtdm->del (), mtdm->del () * 1000.0f/sample_rate);
+       snprintf (buf, sizeof (buf), "%10.3lf samples %10.3lf ms", mtdm->del (), mtdm->del () * 1000.0f/sample_rate);
 
-        bool solid = true;
+       bool solid = true;
 
-        if (mtdm->err () > 0.2) {
-                strcat (buf, " ??");
-                solid = false;
-        }
+       if (mtdm->err () > 0.2) {
+               strcat (buf, " ??");
+               solid = false;
+       }
 
-        if (mtdm->inv ()) {
-                strcat (buf, " (Inv)");
-                solid = false;
-        }
+       if (mtdm->inv ()) {
+               strcat (buf, " (Inv)");
+               solid = false;
+       }
 
-        if (solid) {
-                _pi->set_measured_latency (rint (mtdm->del()));
-                latency_button.set_active (false);
-                strcat (buf, " (set)");
-        }
+       if (solid) {
+               _pi->set_measured_latency (rint (mtdm->del()));
+               latency_button.set_active (false);
+               strcat (buf, " (set)");
+       }
 
-        latency_display.set_text (buf);
+       latency_display.set_text (buf);
 
-        return true;
+       return true;
 }
 
 void
 PortInsertUI::latency_button_toggled ()
 {
-        if (latency_button.get_active ()) {
+       if (latency_button.get_active ()) {
 
-                _pi->start_latency_detection ();
-                latency_display.set_text (_("Detecting ..."));
-                latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &PortInsertUI::check_latency_measurement), 250);
+               _pi->start_latency_detection ();
+               latency_display.set_text (_("Detecting ..."));
+               latency_timeout = Glib::signal_timeout().connect (mem_fun (*this, &PortInsertUI::check_latency_measurement), 250);
 
-        } else {
-                _pi->stop_latency_detection ();
-                latency_timeout.disconnect ();
-                update_latency_display ();
-        }
+       } else {
+               _pi->stop_latency_detection ();
+               latency_timeout.disconnect ();
+               update_latency_display ();
+       }
 }
 
 void
@@ -168,31 +164,26 @@ PortInsertWindow::PortInsertWindow (ARDOUR::Session* sess, boost::shared_ptr<ARD
 {
 
        set_name ("IOSelectorWindow");
-       string title = _("Port Insert ");
+       std::string title = _("Port Insert ");
        title += pi->name();
        set_title (title);
 
        get_vbox()->pack_start (_portinsertui);
 
-       signal_delete_event().connect (sigc::mem_fun (*this, &PortInsertWindow::wm_delete), false);
+       Gtk::Button* cancel_but = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+       Gtk::Button* ok_but = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK);
+
+       cancel_but->signal_clicked().connect (sigc::mem_fun (*this, &PortInsertWindow::cancel));
+       ok_but->signal_clicked().connect (sigc::mem_fun (*this, &PortInsertWindow::accept));
 
-       pi->DropReferences.connect (going_away_connection, invalidator (*this), boost::bind (&PortInsertWindow::plugin_going_away, this), gui_context());
+       signal_delete_event().connect (sigc::mem_fun (*this, &PortInsertWindow::wm_delete), false);
 }
 
 bool
 PortInsertWindow::wm_delete (GdkEventAny* /*event*/)
 {
        accept ();
-       return true;
-}
-
-void
-PortInsertWindow::plugin_going_away ()
-{
-       ENSURE_GUI_THREAD (*this, &PortInsertWindow::plugin_going_away)
-
-       going_away_connection.disconnect ();
-       delete_when_idle (this);
+       return false;
 }
 
 void