change placement of ruler divider so that the lower line is at the specified height...
[ardour.git] / gtk2_ardour / port_group.cc
index 5bdd69a00f5dd90d8dd475f8273fb4a4dae5c227..448a8d3cf55840bb0a45728bf2d350cfb63253fa 100644 (file)
@@ -21,7 +21,6 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/algorithm/string.hpp>
 
-#include "midi++/manager.h"
 #include "midi++/mmc.h"
 
 #include "ardour/audioengine.h"
 #include "ardour/bundle.h"
 #include "ardour/control_protocol_manager.h"
 #include "ardour/io_processor.h"
+#include "ardour/midi_port.h"
+#include "ardour/midiport_manager.h"
 #include "ardour/session.h"
 #include "ardour/user_bundle.h"
+#include "ardour/port.h"
+
 #include "control_protocol/control_protocol.h"
 
 #include "gui_thread.h"
@@ -312,7 +315,7 @@ struct RouteIOs {
 class RouteIOsComparator {
 public:
        bool operator() (RouteIOs const & a, RouteIOs const & b) {
-               return a.route->order_key (EditorSort) < b.route->order_key (EditorSort);
+               return a.route->order_key () < b.route->order_key ();
        }
 };
 
@@ -422,9 +425,20 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
        if (!inputs) {
                ardour->add_bundle (session->the_auditioner()->output()->bundle());
                ardour->add_bundle (session->click_io()->bundle());
+               /* Note: the LTC ports do not have the usual ":audio_out 1" postfix, so
+                *  ardour->add_bundle (session->ltc_output_io()->bundle());
+                *  won't work
+                */
+               boost::shared_ptr<Bundle> ltc (new Bundle (_("LTC Out"), inputs));
+               ltc->add_channel (_("LTC Out"), DataType::AUDIO, session->engine().make_port_name_non_relative (session->ltc_output_port()->name()));
+               ardour->add_bundle (ltc);
+       } else {
+               boost::shared_ptr<Bundle> ltc (new Bundle (_("LTC In"), inputs));
+               ltc->add_channel (_("LTC In"), DataType::AUDIO, session->engine().make_port_name_non_relative (session->ltc_input_port()->name()));
+               ardour->add_bundle (ltc);
        }
 
-       /* Ardour's surfaces */
+       /* Ardour's control surfaces */
 
        ControlProtocolManager& m = ControlProtocolManager::instance ();
        for (list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
@@ -440,42 +454,35 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 
        /* Ardour's sync ports */
 
-       MIDI::Manager* midi_manager = MIDI::Manager::instance ();
-       if (midi_manager && (type == DataType::MIDI || type == DataType::NIL)) {
+       if ((type == DataType::MIDI || type == DataType::NIL)) {
                boost::shared_ptr<Bundle> sync (new Bundle (_("Sync"), inputs));
-               MIDI::MachineControl* mmc = midi_manager->mmc ();
-               AudioEngine& ae = session->engine ();
+               AudioEngine* ae = AudioEngine::instance();
 
                if (inputs) {
                        sync->add_channel (
-                               _("MTC in"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->mtc_input_port()->name())
-                               );
-                       sync->add_channel (
-                               _("MIDI control in"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->midi_input_port()->name())
+                               _("MTC in"), DataType::MIDI, ae->make_port_name_non_relative (session->mtc_input_port()->name())
                                );
                        sync->add_channel (
-                               _("MIDI clock in"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->midi_clock_input_port()->name())
+                               _("MIDI control in"), DataType::MIDI, ae->make_port_name_non_relative (session->midi_input_port()->name())
                                );
                        sync->add_channel (
-                               _("MMC in"), DataType::MIDI, ae.make_port_name_non_relative (mmc->input_port()->name())
+                               _("MIDI clock in"), DataType::MIDI, ae->make_port_name_non_relative (session->midi_clock_input_port()->name())
                                );
-#ifdef HAVE_LIBLTC
                        sync->add_channel (
-                               _("LTC in"), DataType::AUDIO, ae.make_port_name_non_relative (ae->ltc_input_port()->name())
+                               _("MMC in"), DataType::MIDI, ae->make_port_name_non_relative (session->mmc_input_port()->name())
                                );
-#endif
                } else {
                        sync->add_channel (
-                               _("MTC out"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->mtc_output_port()->name())
+                               _("MTC out"), DataType::MIDI, ae->make_port_name_non_relative (session->mtc_output_port()->name())
                                );
                        sync->add_channel (
-                               _("MIDI control out"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->midi_output_port()->name())
+                               _("MIDI control out"), DataType::MIDI, ae->make_port_name_non_relative (session->midi_output_port()->name())
                                );
                        sync->add_channel (
-                               _("MIDI clock out"), DataType::MIDI, ae.make_port_name_non_relative (midi_manager->midi_clock_output_port()->name())
+                               _("MIDI clock out"), DataType::MIDI, ae->make_port_name_non_relative (session->midi_clock_output_port()->name())
                                );
                        sync->add_channel (
-                               _("MMC out"), DataType::MIDI, ae.make_port_name_non_relative (mmc->output_port()->name())
+                               _("MMC out"), DataType::MIDI, ae->make_port_name_non_relative (session->mmc_output_port()->name())
                                );
                }
 
@@ -492,20 +499,12 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
         string lpnc = lpn;
         lpnc += ':';
 
-       const char ** ports = 0;
-       if (type == DataType::NIL) {
-               ports = session->engine().get_ports ("", "", inputs ? JackPortIsInput : JackPortIsOutput);
-       } else {
-               ports = session->engine().get_ports ("", type.to_jack_type(), inputs ? JackPortIsInput : JackPortIsOutput);
-       }
-
-       if (ports) {
-
-               int n = 0;
+       vector<string> ports;
+       if (AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports) > 0) {
 
-               while (ports[n]) {
+               for (vector<string>::const_iterator s = ports.begin(); s != ports.end(); ) {
 
-                       std::string const p = ports[n];
+                       std::string const p = *s;
 
                        if (!system->has_port(p) &&
                            !bus->has_port(p) &&
@@ -519,7 +518,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
                                 */
 
                                 if (p.find ("Midi-Through") != string::npos) {
-                                        ++n;
+                                        ++s;
                                         continue;
                                 }
 
@@ -532,15 +531,15 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
 
                                 if ((lp.find (N_(":monitor")) != string::npos) &&
                                     (lp.find (lpn) != string::npos)) {
-                                        ++n;
+                                        ++s;
                                         continue;
                                 }
 
                                /* can't use the audio engine for this as we are looking at non-Ardour ports */
 
-                               jack_port_t* jp = jack_port_by_name (session->engine().jack(), p.c_str());
-                               if (jp) {
-                                       DataType t (jack_port_type (jp));
+                               PortEngine::PortHandle ph = AudioEngine::instance()->port_engine().get_port_by_name (p);
+                               if (ph) {
+                                       DataType t (AudioEngine::instance()->port_engine().port_data_type (ph));
                                        if (t != DataType::NIL) {
                                                if (port_has_prefix (p, N_("system:")) ||
                                                     port_has_prefix (p, N_("alsa_pcm")) ||
@@ -553,10 +552,8 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
                                }
                        }
 
-                       ++n;
+                       ++s;
                }
-
-               free (ports);
        }
 
        for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
@@ -567,8 +564,22 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp
        }
 
        for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
-               if (!extra_other[*i].empty()) {
-                       boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_other[*i], *i, inputs);
+               if (extra_other[*i].empty()) continue;
+               std::string cp;
+               std::vector<std::string> nb;
+               for (uint32_t j = 0; j < extra_other[*i].size(); ++j) {
+                       std::string nn = extra_other[*i][j];
+                       std::string pf = nn.substr (0, nn.find_first_of (":") + 1);
+                       if (pf != cp && !nb.empty()) {
+                               boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
+                               other->add_bundle (b);
+                               nb.clear();
+                       }
+                       cp = pf;
+                       nb.push_back(extra_other[*i][j]);
+               }
+               if (!nb.empty()) {
+                       boost::shared_ptr<Bundle> b = make_bundle_from_ports (nb, *i, inputs);
                        other->add_bundle (b);
                }
        }
@@ -599,7 +610,12 @@ PortGroupList::make_bundle_from_ports (std::vector<std::string> const & p, ARDOU
        }
 
        for (uint32_t j = 0; j < p.size(); ++j) {
-               b->add_channel (p[j].substr (pre.length()), type);
+               std::string n = p[j].substr (pre.length());
+               std::string pn = AudioEngine::instance()->get_pretty_name_by_name (p[j]);
+               if (!pn.empty()) {
+                       n = pn;
+               }
+               b->add_channel (n, type);
                b->set_port (j, p[j]);
        }