X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.cc;h=2d445dcbb273ee9bab208c6981ea49a0da439de7;hb=331d9f7154267ee7efea0f51fb140828d308fd9a;hp=cafcaad51fc44bf9da6b4023953f233dc33d886d;hpb=a1a3f6c8265264227ce19f731bf1863aff229a94;p=ardour.git diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index cafcaad51f..2d445dcbb2 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -30,9 +30,10 @@ #include "ardour/io_processor.h" #include "ardour/midi_port.h" #include "ardour/midiport_manager.h" +#include "ardour/port.h" +#include "ardour/profile.h" #include "ardour/session.h" #include "ardour/user_bundle.h" -#include "ardour/port.h" #include "control_protocol/control_protocol.h" @@ -337,7 +338,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp boost::shared_ptr bus (new PortGroup (string_compose (_("%1 Busses"), PROGRAM_NAME))); boost::shared_ptr track (new PortGroup (string_compose (_("%1 Tracks"), PROGRAM_NAME))); boost::shared_ptr system (new PortGroup (_("Hardware"))); - boost::shared_ptr ardour (new PortGroup (string_compose (_("%1 Misc"), PROGRAM_NAME))); + boost::shared_ptr program (new PortGroup (string_compose (_("%1 Misc"), PROGRAM_NAME))); boost::shared_ptr other (new PortGroup (_("Other"))); /* Find the IOs which have bundles for routes and their processors. We store @@ -420,39 +421,48 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp } } - /* Ardour stuff */ + /* miscellany */ - 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 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 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); + if (type == DataType::AUDIO || type == DataType::NIL) { + if (!inputs) { + program->add_bundle (session->the_auditioner()->output()->bundle()); + program->add_bundle (session->click_io()->bundle()); + /* Note: the LTC ports do not have the usual ":audio_out 1" postfix, so + * program->add_bundle (session->ltc_output_io()->bundle()); + * won't work + */ + boost::shared_ptr 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())); + program->add_bundle (ltc); + } else { + boost::shared_ptr 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())); + program->add_bundle (ltc); + } } - /* Ardour's control surfaces */ + /* our control surfaces */ + + /* XXX assume for now that all control protocols with ports use + * MIDI. If anyone created a control protocol that used audio ports, + * this will break. + */ - ControlProtocolManager& m = ControlProtocolManager::instance (); - for (list::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) { - if ((*i)->protocol) { - list > b = (*i)->protocol->bundles (); - for (list >::iterator j = b.begin(); j != b.end(); ++j) { - if ((*j)->ports_are_inputs() == inputs) { - ardour->add_bundle (*j); + if ((type == DataType::MIDI || type == DataType::NIL)) { + ControlProtocolManager& m = ControlProtocolManager::instance (); + for (list::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) { + if ((*i)->protocol) { + list > b = (*i)->protocol->bundles (); + for (list >::iterator j = b.begin(); j != b.end(); ++j) { + if ((*j)->ports_are_inputs() == inputs) { + program->add_bundle (*j); + } } } } } - /* Ardour's sync ports */ + /* our sync ports */ if ((type == DataType::MIDI || type == DataType::NIL)) { boost::shared_ptr sync (new Bundle (_("Sync"), inputs)); @@ -486,12 +496,13 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp ); } - ardour->add_bundle (sync); + program->add_bundle (sync); } /* Now find all other ports that we haven't thought of yet */ std::vector extra_system[DataType::num_types]; + std::vector extra_program[DataType::num_types]; std::vector extra_other[DataType::num_types]; string lpn (PROGRAM_NAME); @@ -500,7 +511,18 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp lpnc += ':'; vector ports; - if (AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports) > 0) { + if (type == DataType::NIL) { + vector p1; + AudioEngine::instance()->get_ports ("", DataType::AUDIO, inputs ? IsInput : IsOutput, ports); + AudioEngine::instance()->get_ports ("", DataType::MIDI, inputs ? IsInput : IsOutput, p1); + for (vector::const_iterator s = p1.begin(); s != p1.end(); ++s) { + ports.push_back (*s); + } + } else { + AudioEngine::instance()->get_ports ("", type, inputs ? IsInput : IsOutput, ports); + } + + if (ports.size () > 0) { for (vector::const_iterator s = ports.begin(); s != ports.end(); ) { @@ -509,7 +531,7 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp if (!system->has_port(p) && !bus->has_port(p) && !track->has_port(p) && - !ardour->has_port(p) && + !program->has_port(p) && !other->has_port(p)) { /* special hack: ignore MIDI ports labelled Midi-Through. these @@ -535,16 +557,29 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp continue; } - /* can't use the audio engine for this as we are looking at non-Ardour ports */ + /* can't use the audio engine for this as we + * are looking at ports not owned by the + * application, and the audio engine/port + * manager doesn't seem them. + */ 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")) || - port_has_prefix (p, lpnc)) { + port_has_prefix (p, N_("alsa_pcm:")) || + port_has_prefix (p, N_("alsa_midi:"))) { extra_system[t].push_back (p); + } else if (port_has_prefix (p, lpnc)) { + /* Hide scene ports from non-Tracks Live builds */ + if (!ARDOUR::Profile->get_trx()) { + if (p.find (_("Scene ")) != string::npos) { + ++s; + continue; + } + } + extra_program[t].push_back (p); } else { extra_other[t].push_back (p); } @@ -563,6 +598,15 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp } } + for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { + if (!extra_program[*i].empty()) { + /* remove program name prefix from port name and use rest as bundle name */ + std::string bundle_name = extra_program[*i].front().substr (lpnc.length()); + boost::shared_ptr b = make_bundle_from_ports (extra_program[*i], *i, inputs, bundle_name); + program->add_bundle (b); + } + } + for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { if (extra_other[*i].empty()) continue; std::string cp; @@ -593,24 +637,33 @@ PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inp add_group_if_not_empty (bus); } add_group_if_not_empty (track); - add_group_if_not_empty (ardour); + add_group_if_not_empty (program); add_group_if_not_empty (system); emit_changed (); } boost::shared_ptr -PortGroupList::make_bundle_from_ports (std::vector const & p, ARDOUR::DataType type, bool inputs) const +PortGroupList::make_bundle_from_ports (std::vector const & p, ARDOUR::DataType type, bool inputs, std::string const& bundle_name) const { boost::shared_ptr b (new Bundle ("", inputs)); - std::string const pre = common_prefix (p); - if (!pre.empty()) { - b->set_name (pre.substr (0, pre.length() - 1)); + + if (!bundle_name.empty()) { + b->set_name (bundle_name); + } else { + if (!pre.empty()) { + b->set_name (pre.substr (0, pre.length() - 1)); + } } 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]); } @@ -791,4 +844,3 @@ PortGroupList::empty () const { return _groups.empty (); } -