summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-07-07 00:40:58 +0000
committerCarl Hetherington <carl@carlh.net>2010-07-07 00:40:58 +0000
commitea23298f10e9587eba483cb54a6f7d75ca68126a (patch)
treebdd396ac05d0be01cbbcc6447844a04814e79cbf /gtk2_ardour
parent6cccf3ce7dc86998d6797f393bec5b69610fc5f3 (diff)
Setup fixed ports for MIDI control data; hence remove configuration of those ports. Move MIDI tracer to the Windows menu. Trim some unused code from the midi++ Manager.
git-svn-id: svn://localhost/ardour2/branches/3.0@7384 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardev_common.sh.in2
-rw-r--r--gtk2_ardour/ardour.menus.in1
-rw-r--r--gtk2_ardour/ardour_ui.cc3
-rw-r--r--gtk2_ardour/ardour_ui.h4
-rw-r--r--gtk2_ardour/ardour_ui2.cc4
-rw-r--r--gtk2_ardour/ardour_ui_dialogs.cc17
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc2
-rw-r--r--gtk2_ardour/midi_tracer.cc69
-rw-r--r--gtk2_ardour/midi_tracer.h12
-rw-r--r--gtk2_ardour/rc_option_editor.cc257
-rw-r--r--gtk2_ardour/rc_option_editor.h2
11 files changed, 98 insertions, 275 deletions
diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in
index 10a37a6ae8..1aef253d09 100644
--- a/gtk2_ardour/ardev_common.sh.in
+++ b/gtk2_ardour/ardev_common.sh.in
@@ -9,10 +9,8 @@ export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs
export ARDOUR_DATA_PATH=$TOP/gtk2_ardour:build/default/gtk2_ardour:.
if test -d $HOME/gtk/inst ; then
- echo USING NEW CLEARLOOKS
export GTK_PATH=~/.ardour3:$libs/clearlooks-newer
else
- echo USING OLD CLEARLOOKS
export GTK_PATH=~/.ardour3:$libs/clearlooks-older
fi
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in
index 85df23ab14..e2edc18f0a 100644
--- a/gtk2_ardour/ardour.menus.in
+++ b/gtk2_ardour/ardour.menus.in
@@ -437,6 +437,7 @@
<menuitem action='ToggleBundleManager'/>
<menuitem action='ToggleThemeManager'/>
<menuitem action='ToggleBigClock'/>
+ <menuitem action='ToggleMIDITracer'/>
<menuitem action='toggle-audio-connection-manager'/>
<menuitem action='toggle-midi-connection-manager'/>
<menuitem action='toggle-log-window'/>
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 10fdeb991e..11cea54c02 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -365,9 +365,6 @@ ARDOUR_UI::post_engine ()
/* Things to be done once we create the AudioEngine
*/
- MIDI::Manager::instance()->set_api_data (engine->jack());
- setup_midi ();
-
ARDOUR::init_post_engine ();
ActionManager::init ();
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 643202a32b..c0cc88f24e 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -84,6 +84,7 @@ class RouteParams_UI;
class SessionOptionEditor;
class Splash;
class ThemeManager;
+class MidiTracer;
namespace Gtkmm2ext {
class TearOff;
@@ -164,6 +165,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void toggle_theme_manager ();
void toggle_bundle_manager ();
void toggle_big_clock_window ();
+ void toggle_midi_tracer_window ();
void toggle_route_params_window ();
void toggle_editing_space();
@@ -325,6 +327,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void update_transport_clocks (nframes_t pos);
void record_state_changed ();
+ MidiTracer* _midi_tracer_window;
+
/* Transport Control */
void detach_tearoff (Gtk::Box* parent, Gtk::Widget* contents);
diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc
index 9991a1dc14..3a321cc5e3 100644
--- a/gtk2_ardour/ardour_ui2.cc
+++ b/gtk2_ardour/ardour_ui2.cc
@@ -45,6 +45,7 @@
#include "actions.h"
#include "utils.h"
#include "theme_manager.h"
+#include "midi_tracer.h"
#include "i18n.h"
@@ -106,6 +107,9 @@ ARDOUR_UI::setup_windows ()
setup_transport();
build_menu_bar ();
+ _midi_tracer_window = new MidiTracer ();
+ manage_window (*_midi_tracer_window);
+
setup_tooltips ();
return 0;
diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc
index 0c1240e435..6ae05ef0ee 100644
--- a/gtk2_ardour/ardour_ui_dialogs.cc
+++ b/gtk2_ardour/ardour_ui_dialogs.cc
@@ -39,6 +39,7 @@
#include "bundle_manager.h"
#include "keyeditor.h"
#include "gui_thread.h"
+#include "midi_tracer.h"
#include "i18n.h"
@@ -215,6 +216,22 @@ ARDOUR_UI::toggle_big_clock_window ()
}
void
+ARDOUR_UI::toggle_midi_tracer_window ()
+{
+ RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleMIDITracer"));
+ if (!act) {
+ return;
+ }
+
+ RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic (act);
+ if (tact->get_active ()) {
+ _midi_tracer_window->show_all ();
+ } else {
+ _midi_tracer_window->hide ();
+ }
+}
+
+void
ARDOUR_UI::toggle_rc_options_window ()
{
if (rc_option_editor == 0) {
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index b29da7ba70..80950e2d32 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -225,6 +225,8 @@ ARDOUR_UI::install_actions ()
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_toggle_action (common_actions, X_("ToggleBigClock"), _("Big Clock"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_big_clock_window));
ActionManager::session_sensitive_actions.push_back (act);
+ act = ActionManager::register_toggle_action (common_actions, X_("ToggleMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_midi_tracer_window));
+ ActionManager::session_sensitive_actions.push_back (act);
ActionManager::register_action (common_actions, X_("About"), _("About"), sigc::mem_fun(*this, &ARDOUR_UI::show_about));
ActionManager::register_action (common_actions, X_("Chat"), _("Chat"), sigc::mem_fun(*this, &ARDOUR_UI::launch_chat));
ActionManager::register_toggle_action (common_actions, X_("ToggleThemeManager"), _("Theme Manager"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_theme_manager));
diff --git a/gtk2_ardour/midi_tracer.cc b/gtk2_ardour/midi_tracer.cc
index a12f756a0f..a1ac7e14f9 100644
--- a/gtk2_ardour/midi_tracer.cc
+++ b/gtk2_ardour/midi_tracer.cc
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2010 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
#define __STDC_FORMAT_MACROS 1
#include <stdint.h>
@@ -6,6 +25,7 @@
#include <time.h>
#include "midi++/parser.h"
+#include "midi++/manager.h"
#include "midi_tracer.h"
#include "gui_thread.h"
@@ -16,9 +36,9 @@ using namespace std;
using namespace MIDI;
using namespace Glib;
-MidiTracer::MidiTracer (const std::string& name, Parser& p)
- : ArdourDialog (string_compose (_("MIDI Trace %1"), name))
- , parser (p)
+MidiTracer::MidiTracer ()
+ : ArdourDialog (_("MIDI Tracer"))
+ , parser (0)
, line_count_adjustment (200, 1, 2000, 1, 10)
, line_count_spinner (line_count_adjustment)
, line_count_label (_("Store this many lines: "))
@@ -32,6 +52,18 @@ MidiTracer::MidiTracer (const std::string& name, Parser& p)
, base_button (_("Decimal"))
, collect_button (_("Enabled"))
{
+ get_vbox()->set_spacing (4);
+
+ Manager::instance()->PortsChanged.connect (_manager_connection, invalidator (*this), boost::bind (&MidiTracer::ports_changed, this), gui_context());
+
+ HBox* pbox = manage (new HBox);
+ pbox->pack_start (*manage (new Label (_("Port:"))), false, false);
+
+ _port_combo.signal_changed().connect (sigc::mem_fun (*this, &MidiTracer::port_changed));
+ pbox->pack_start (_port_combo);
+ pbox->show_all ();
+ get_vbox()->pack_start (*pbox, false, false);
+
scroller.add (text);
get_vbox()->set_border_width (12);
get_vbox()->pack_start (scroller, true, true);
@@ -71,7 +103,8 @@ MidiTracer::MidiTracer (const std::string& name, Parser& p)
collect_button.show ();
autoscroll_button.show ();
- connect ();
+ ports_changed ();
+ port_changed ();
}
@@ -80,16 +113,36 @@ MidiTracer::~MidiTracer()
}
void
-MidiTracer::connect ()
+MidiTracer::ports_changed ()
+{
+ string const c = _port_combo.get_active_text ();
+ _port_combo.clear ();
+
+ Manager::PortList const & p = Manager::instance()->get_midi_ports ();
+ for (Manager::PortList::const_iterator i = p.begin(); i != p.end(); ++i) {
+ _port_combo.append_text ((*i)->name());
+ }
+
+ _port_combo.set_active_text (c);
+}
+
+void
+MidiTracer::port_changed ()
{
disconnect ();
- parser.any.connect_same_thread (connection, boost::bind (&MidiTracer::tracer, this, _1, _2, _3));
+
+ Port* p = Manager::instance()->port (_port_combo.get_active_text());
+
+ if (p) {
+ Parser* parser = p->input() ? p->input() : p->output();
+ parser->any.connect_same_thread (_parser_connection, boost::bind (&MidiTracer::tracer, this, _1, _2, _3));
+ }
}
void
MidiTracer::disconnect ()
{
- connection.disconnect ();
+ _parser_connection.disconnect ();
}
void
@@ -330,7 +383,7 @@ void
MidiTracer::collect_toggle ()
{
if (collect_button.get_active ()) {
- connect ();
+ port_changed ();
} else {
disconnect ();
}
diff --git a/gtk2_ardour/midi_tracer.h b/gtk2_ardour/midi_tracer.h
index fb5943370d..b37c4a2351 100644
--- a/gtk2_ardour/midi_tracer.h
+++ b/gtk2_ardour/midi_tracer.h
@@ -7,6 +7,7 @@
#include <gtkmm/adjustment.h>
#include <gtkmm/spinbutton.h>
#include <gtkmm/label.h>
+#include <gtkmm/comboboxtext.h>
#include "pbd/signals.h"
#include "pbd/ringbuffer.h"
@@ -21,11 +22,11 @@ namespace MIDI {
class MidiTracer : public ArdourDialog
{
public:
- MidiTracer (const std::string&, MIDI::Parser&);
+ MidiTracer ();
~MidiTracer();
private:
- MIDI::Parser& parser;
+ MIDI::Parser* parser;
Gtk::TextView text;
Gtk::ScrolledWindow scroller;
Gtk::Adjustment line_count_adjustment;
@@ -53,14 +54,17 @@ class MidiTracer : public ArdourDialog
Gtk::CheckButton autoscroll_button;
Gtk::CheckButton base_button;
Gtk::CheckButton collect_button;
+ Gtk::ComboBoxText _port_combo;
void base_toggle ();
void autoscroll_toggle ();
void collect_toggle ();
- void connect ();
+ void port_changed ();
+ void ports_changed ();
void disconnect ();
- PBD::ScopedConnection connection;
+ PBD::ScopedConnection _parser_connection;
+ PBD::ScopedConnection _manager_connection;
};
#endif /* __ardour_gtk_midi_tracer_h__ */
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index ec3af3e745..bec67099ea 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -30,225 +30,6 @@ using namespace Gtkmm2ext;
using namespace PBD;
using namespace ARDOUR;
-class MIDIPorts : public OptionEditorBox
-{
-public:
- MIDIPorts (RCConfiguration* c, list<ComboOption<string>* > const & o)
- : _rc_config (c),
- _add_port_button (Stock::ADD),
- _port_combos (o)
- {
- _store = ListStore::create (_model);
- _view.set_model (_store);
- _view.append_column (_("Name"), _model.name);
- _view.get_column(0)->set_resizable (true);
- _view.get_column(0)->set_expand (true);
- _view.append_column_editable (_("Online"), _model.online);
- _view.append_column_editable (_("Trace input"), _model.trace_input);
- _view.append_column_editable (_("Trace output"), _model.trace_output);
-
- HBox* h = manage (new HBox);
- h->set_spacing (4);
- h->pack_start (_view, true, true);
-
- VBox* v = manage (new VBox);
- v->set_spacing (4);
- v->pack_start (_add_port_button, false, false);
- h->pack_start (*v, false, false);
-
- _box->pack_start (*h);
-
- ports_changed ();
-
- _store->signal_row_changed().connect (sigc::mem_fun (*this, &MIDIPorts::model_changed));
-
- _add_port_button.signal_clicked().connect (sigc::mem_fun (*this, &MIDIPorts::add_port_clicked));
- }
-
- void parameter_changed (string const &) {}
- void set_state_from_config () {}
-
-private:
-
- typedef std::map<MIDI::Port*,MidiTracer*> PortTraceMap;
- PortTraceMap port_input_trace_map;
- PortTraceMap port_output_trace_map;
-
- void model_changed (TreeModel::Path const &, TreeModel::iterator const & i)
- {
- TreeModel::Row r = *i;
-
- MIDI::Port* port = r[_model.port];
- if (!port) {
- return;
- }
-
- if (port->input()) {
-
- if (r[_model.online] == port->input()->offline()) {
- port->input()->set_offline (!r[_model.online]);
- }
-
- if (r[_model.trace_input] != port->input()->tracing()) {
- PortTraceMap::iterator x = port_input_trace_map.find (port);
- MidiTracer* mt;
-
- if (x == port_input_trace_map.end()) {
- mt = new MidiTracer (port->name() + string (" [input]"), *port->input());
- port_input_trace_map.insert (pair<MIDI::Port*,MidiTracer*> (port, mt));
- } else {
- mt = x->second;
- }
- mt->present ();
- }
- }
-
- if (port->output()) {
-
- if (r[_model.trace_output] != port->output()->tracing()) {
- PortTraceMap::iterator x = port_output_trace_map.find (port);
- MidiTracer* mt;
-
- if (x == port_output_trace_map.end()) {
- mt = new MidiTracer (port->name() + string (" [output]"), *port->output());
- port_output_trace_map.insert (pair<MIDI::Port*,MidiTracer*> (port, mt));
- } else {
- mt = x->second;
- }
- mt->present ();
- }
-
- }
- }
-
- void setup_ports_combo (ComboOption<string>* c)
- {
- c->clear ();
- MIDI::Manager::PortList const & ports = MIDI::Manager::instance()->get_midi_ports ();
- for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) {
- c->add ((*i)->name(), (*i)->name());
- }
- }
-
- void ports_changed ()
- {
- /* XXX: why is this coming from here? */
- MIDI::Manager::PortList const & ports = MIDI::Manager::instance()->get_midi_ports ();
-
- _store->clear ();
- port_connections.drop_connections ();
-
- for (MIDI::Manager::PortList::const_iterator i = ports.begin(); i != ports.end(); ++i) {
-
- TreeModel::Row r = *_store->append ();
-
- r[_model.name] = (*i)->name();
-
- if ((*i)->input()) {
- r[_model.online] = !(*i)->input()->offline();
- (*i)->input()->OfflineStatusChanged.connect (port_connections, MISSING_INVALIDATOR, boost::bind (&MIDIPorts::port_offline_changed, this, (*i)), gui_context());
- r[_model.trace_input] = (*i)->input()->tracing();
- }
-
- if ((*i)->output()) {
- r[_model.trace_output] = (*i)->output()->tracing();
- }
-
- r[_model.port] = (*i);
- }
-
- for (list<ComboOption<string>* >::iterator i = _port_combos.begin(); i != _port_combos.end(); ++i) {
- setup_ports_combo (*i);
- }
- }
-
- void port_offline_changed (MIDI::Port* p)
- {
- if (!p->input()) {
- return;
- }
-
- for (TreeModel::Children::iterator i = _store->children().begin(); i != _store->children().end(); ++i) {
- if ((*i)[_model.port] == p) {
- (*i)[_model.online] = !p->input()->offline();
- }
- }
- }
-
- void add_port_clicked ()
- {
- MidiPortDialog dialog;
-
- dialog.set_position (WIN_POS_MOUSE);
-
- dialog.show ();
-
- int const r = dialog.run ();
-
- switch (r) {
- case RESPONSE_ACCEPT:
- break;
- default:
- return;
- break;
- }
-
- Glib::ustring const mode = dialog.port_mode_combo.get_active_text ();
- string smod;
-
- if (mode == _("input")) {
- smod = X_("input");
- } else if (mode == (_("output"))) {
- smod = X_("output");
- } else {
- smod = "duplex";
- }
-
- XMLNode node (X_("MIDI-port"));
-
- node.add_property ("tag", dialog.port_name.get_text());
- node.add_property ("device", X_("ardour")); // XXX this can't be right for all types
- node.add_property ("mode", smod);
-
- if (MIDI::Manager::instance()->add_port (node) != 0) {
- cerr << " there are now " << MIDI::Manager::instance()->nports() << endl;
- ports_changed ();
- }
- }
-
- class MIDIModelColumns : public TreeModelColumnRecord
- {
- public:
- MIDIModelColumns ()
- {
- add (name);
- add (online);
- add (trace_input);
- add (trace_output);
- add (port);
- }
-
- TreeModelColumn<string> name;
- TreeModelColumn<bool> online;
- TreeModelColumn<bool> trace_input;
- TreeModelColumn<bool> trace_output;
- TreeModelColumn<MIDI::Port*> port;
- };
-
- RCConfiguration* _rc_config;
- Glib::RefPtr<ListStore> _store;
- MIDIModelColumns _model;
- TreeView _view;
- Button _add_port_button;
- ComboBoxText _mtc_combo;
- ComboBoxText _midi_clock_combo;
- ComboBoxText _mmc_combo;
- ComboBoxText _mpc_combo;
- list<ComboOption<string>* > _port_combos;
- PBD::ScopedConnectionList port_connections;
-};
-
-
class ClickOptions : public OptionEditorBox
{
public:
@@ -1429,44 +1210,6 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
));
- /* MIDI CONTROL */
-
- list<ComboOption<string>* > midi_combos;
-
- midi_combos.push_back (new ComboOption<string> (
- "mtc-port-name",
- _("Send/Receive MTC via"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_mtc_port_name),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_mtc_port_name)
- ));
-
- midi_combos.push_back (new ComboOption<string> (
- "midi-clock-port-name",
- _("Send/Receive MIDI clock via"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_clock_port_name),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_clock_port_name)
- ));
-
- midi_combos.push_back (new ComboOption<string> (
- "mmc-port-name",
- _("Send/Receive MMC via"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_mmc_port_name),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_mmc_port_name)
- ));
-
- midi_combos.push_back (new ComboOption<string> (
- "midi-port-name",
- _("Send/Receive MIDI parameter control via"),
- sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_port_name),
- sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_port_name)
- ));
-
- add_option (_("MIDI control"), new MIDIPorts (_rc_config, midi_combos));
-
- for (list<ComboOption<string>* >::iterator i = midi_combos.begin(); i != midi_combos.end(); ++i) {
- add_option (_("MIDI control"), *i);
- }
-
add_option (_("MIDI control"),
new BoolOption (
"send-mtc",
diff --git a/gtk2_ardour/rc_option_editor.h b/gtk2_ardour/rc_option_editor.h
index c0b558fac1..367c85402b 100644
--- a/gtk2_ardour/rc_option_editor.h
+++ b/gtk2_ardour/rc_option_editor.h
@@ -5,7 +5,7 @@
*
* This is subclassed from OptionEditor. Simple options (e.g. boolean and simple choices)
* are expressed using subclasses of Option. More complex UI elements are represented
- * using individual classes subclassed rom OptionEditorBox.
+ * using individual classes subclassed from OptionEditorBox.
*/
/** Editor for options which are obtained from and written back to one of the .rc files. */