diff options
author | Carl Hetherington <carl@carlh.net> | 2010-07-07 00:40:58 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2010-07-07 00:40:58 +0000 |
commit | ea23298f10e9587eba483cb54a6f7d75ca68126a (patch) | |
tree | bdd396ac05d0be01cbbcc6447844a04814e79cbf /gtk2_ardour | |
parent | 6cccf3ce7dc86998d6797f393bec5b69610fc5f3 (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.in | 2 | ||||
-rw-r--r-- | gtk2_ardour/ardour.menus.in | 1 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 3 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui2.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_dialogs.cc | 17 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui_ed.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/midi_tracer.cc | 69 | ||||
-rw-r--r-- | gtk2_ardour/midi_tracer.h | 12 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 257 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.h | 2 |
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. */ |