2 Copyright (C) 2002-2007 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <gtkmm/messagedialog.h>
21 #include <glibmm/objectbase.h>
23 #include <gtkmm2ext/doi.h>
25 #include "ardour/port_insert.h"
26 #include "ardour/session.h"
27 #include "ardour/io.h"
28 #include "ardour/audioengine.h"
29 #include "ardour/track.h"
30 #include "ardour/audio_track.h"
31 #include "ardour/midi_track.h"
32 #include "ardour/mtdm.h"
33 #include "ardour/data_type.h"
34 #include "ardour/port.h"
35 #include "ardour/bundle.h"
37 #include "port_insert_ui.h"
39 #include "gui_thread.h"
42 using namespace ARDOUR
;
45 PortInsertUI::PortInsertUI (Gtk::Window
* parent
, ARDOUR::Session
* sess
, boost::shared_ptr
<ARDOUR::PortInsert
> pi
)
47 , latency_button (_("Measure Latency"))
48 , input_selector (parent
, sess
, pi
->input())
49 , output_selector (parent
, sess
, pi
->output())
51 latency_hbox
.pack_start (latency_button
, false, false);
52 latency_hbox
.pack_start (latency_display
, false, false);
54 output_selector
.set_min_height_divisor (2);
55 input_selector
.set_min_height_divisor (2);
57 notebook
.append_page (output_selector
, _("Send/Output"));
58 notebook
.append_page (input_selector
, _("Return/Input"));
60 notebook
.set_current_page (0);
63 pack_start (notebook
, true, true);
64 pack_start (latency_hbox
, false, false);
66 update_latency_display ();
68 latency_button
.signal_toggled().connect (mem_fun (*this, &PortInsertUI::latency_button_toggled
));
72 PortInsertUI::update_latency_display ()
74 framecnt_t
const sample_rate
= input_selector
.session()->engine().frame_rate();
75 if (sample_rate
== 0) {
76 latency_display
.set_text (_("Disconnected from audio engine"));
79 snprintf (buf
, sizeof (buf
), "%10.3lf frames %10.3lf ms",
80 (float)_pi
->latency(), (float)_pi
->latency() * 1000.0f
/sample_rate
);
81 latency_display
.set_text(buf
);
86 PortInsertUI::check_latency_measurement ()
88 MTDM
* mtdm
= _pi
->mtdm ();
90 if (mtdm
->resolve () < 0) {
91 latency_display
.set_text (_("No signal detected"));
95 if (mtdm
->err () > 0.3) {
101 framecnt_t
const sample_rate
= AudioEngine::instance()->frame_rate();
103 if (sample_rate
== 0) {
104 latency_display
.set_text (_("Disconnected from audio engine"));
105 _pi
->stop_latency_detection ();
109 snprintf (buf
, sizeof (buf
), "%10.3lf frames %10.3lf ms", mtdm
->del (), mtdm
->del () * 1000.0f
/sample_rate
);
113 if (mtdm
->err () > 0.2) {
119 strcat (buf
, " (Inv)");
124 _pi
->set_measured_latency (rint (mtdm
->del()));
125 latency_button
.set_active (false);
126 strcat (buf
, " (set)");
129 latency_display
.set_text (buf
);
135 PortInsertUI::latency_button_toggled ()
137 if (latency_button
.get_active ()) {
139 _pi
->start_latency_detection ();
140 latency_display
.set_text (_("Detecting ..."));
141 latency_timeout
= Glib::signal_timeout().connect (mem_fun (*this, &PortInsertUI::check_latency_measurement
), 250);
144 _pi
->stop_latency_detection ();
145 latency_timeout
.disconnect ();
146 update_latency_display ();
151 PortInsertUI::redisplay ()
153 input_selector
.setup_ports (input_selector
.other());
154 output_selector
.setup_ports (output_selector
.other());
158 PortInsertUI::finished (IOSelector::Result r
)
160 input_selector
.Finished (r
);
161 output_selector
.Finished (r
);
165 PortInsertWindow::PortInsertWindow (ARDOUR::Session
* sess
, boost::shared_ptr
<ARDOUR::PortInsert
> pi
)
166 : ArdourDialog ("port insert dialog"),
167 _portinsertui (this, sess
, pi
)
170 set_name ("IOSelectorWindow");
171 string title
= _("Port Insert ");
175 get_vbox()->pack_start (_portinsertui
);
177 signal_delete_event().connect (sigc::mem_fun (*this, &PortInsertWindow::wm_delete
), false);
179 pi
->DropReferences
.connect (going_away_connection
, invalidator (*this), boost::bind (&PortInsertWindow::plugin_going_away
, this), gui_context());
183 PortInsertWindow::wm_delete (GdkEventAny
* /*event*/)
190 PortInsertWindow::plugin_going_away ()
192 ENSURE_GUI_THREAD (*this, &PortInsertWindow::plugin_going_away
)
194 going_away_connection
.disconnect ();
195 delete_when_idle (this);
199 PortInsertWindow::on_map ()
201 _portinsertui
.redisplay ();
207 PortInsertWindow::cancel ()
209 _portinsertui
.finished (IOSelector::Cancelled
);
214 PortInsertWindow::accept ()
216 _portinsertui
.finished (IOSelector::Accepted
);