mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
Add global port matrix dialogs.
git-svn-id: svn://localhost/ardour2/branches/3.0@4434 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
9245b7f959
commit
f6652f07ae
20 changed files with 434 additions and 153 deletions
|
|
@ -185,6 +185,7 @@ plugin_eq_gui.cc
|
||||||
gain_meter.cc
|
gain_meter.cc
|
||||||
generic_pluginui.cc
|
generic_pluginui.cc
|
||||||
ghostregion.cc
|
ghostregion.cc
|
||||||
|
global_port_matrix.cc
|
||||||
gtk-custom-hruler.c
|
gtk-custom-hruler.c
|
||||||
gtk-custom-ruler.c
|
gtk-custom-ruler.c
|
||||||
io_selector.cc
|
io_selector.cc
|
||||||
|
|
|
||||||
|
|
@ -429,6 +429,8 @@
|
||||||
<menuitem action='ToggleBigClock'/>
|
<menuitem action='ToggleBigClock'/>
|
||||||
<menuitem action='toggle-rhythm-ferret'/>
|
<menuitem action='toggle-rhythm-ferret'/>
|
||||||
<menuitem action='toggle-bundle-manager'/>
|
<menuitem action='toggle-bundle-manager'/>
|
||||||
|
<menuitem action='toggle-audio-connection-manager'/>
|
||||||
|
<menuitem action='toggle-midi-connection-manager'/>
|
||||||
<separator/>
|
<separator/>
|
||||||
</menu>
|
</menu>
|
||||||
<menu name='Options' action='Options'>
|
<menu name='Options' action='Options'>
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ BundleEditorMatrix::BundleEditorMatrix (
|
||||||
PortGroupList::Mask (PortGroupList::SYSTEM | PortGroupList::OTHER)
|
PortGroupList::Mask (PortGroupList::SYSTEM | PortGroupList::OTHER)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_our_bundle = bundle;
|
_our_bundles.push_back (bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -61,7 +61,7 @@ BundleEditorMatrix::set_state (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
PortMatrix::State
|
||||||
BundleEditorMatrix::get_state (
|
BundleEditorMatrix::get_state (
|
||||||
boost::shared_ptr<ARDOUR::Bundle> ab,
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
uint32_t ac,
|
uint32_t ac,
|
||||||
|
|
@ -72,11 +72,11 @@ BundleEditorMatrix::get_state (
|
||||||
ARDOUR::Bundle::PortList const& pl = bb->channel_ports (bc);
|
ARDOUR::Bundle::PortList const& pl = bb->channel_ports (bc);
|
||||||
for (ARDOUR::Bundle::PortList::const_iterator i = pl.begin(); i != pl.end(); ++i) {
|
for (ARDOUR::Bundle::PortList::const_iterator i = pl.begin(); i != pl.end(); ++i) {
|
||||||
if (!ab->port_attached_to_channel (ac, *i)) {
|
if (!ab->port_attached_to_channel (ac, *i)) {
|
||||||
return false;
|
return NOT_ASSOCIATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return ASSOCIATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -89,14 +89,14 @@ BundleEditorMatrix::add_channel (boost::shared_ptr<ARDOUR::Bundle> b)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_our_bundle->add_channel (d.get_name());
|
_our_bundles.front()->add_channel (d.get_name());
|
||||||
setup ();
|
setup ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BundleEditorMatrix::remove_channel (boost::shared_ptr<ARDOUR::Bundle> b, uint32_t c)
|
BundleEditorMatrix::remove_channel (boost::shared_ptr<ARDOUR::Bundle> b, uint32_t c)
|
||||||
{
|
{
|
||||||
_our_bundle->remove_channel (c);
|
_our_bundles.front()->remove_channel (c);
|
||||||
setup ();
|
setup ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ class BundleEditorMatrix : public PortMatrix
|
||||||
uint32_t k
|
uint32_t k
|
||||||
);
|
);
|
||||||
|
|
||||||
bool get_state (
|
State get_state (
|
||||||
boost::shared_ptr<ARDOUR::Bundle> ab,
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
uint32_t ac,
|
uint32_t ac,
|
||||||
boost::shared_ptr<ARDOUR::Bundle> bb,
|
boost::shared_ptr<ARDOUR::Bundle> bb,
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@
|
||||||
#include "tempo_lines.h"
|
#include "tempo_lines.h"
|
||||||
#include "analysis_window.h"
|
#include "analysis_window.h"
|
||||||
#include "bundle_manager.h"
|
#include "bundle_manager.h"
|
||||||
|
#include "global_port_matrix.h"
|
||||||
|
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
|
|
@ -349,6 +350,9 @@ Editor::Editor ()
|
||||||
zoomed_to_region = false;
|
zoomed_to_region = false;
|
||||||
rhythm_ferret = 0;
|
rhythm_ferret = 0;
|
||||||
_bundle_manager = 0;
|
_bundle_manager = 0;
|
||||||
|
for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) {
|
||||||
|
_global_port_matrix[*i] = 0;
|
||||||
|
}
|
||||||
allow_vertical_scroll = false;
|
allow_vertical_scroll = false;
|
||||||
no_save_visual = false;
|
no_save_visual = false;
|
||||||
need_resize_line = false;
|
need_resize_line = false;
|
||||||
|
|
@ -5139,6 +5143,16 @@ Editor::show_bundle_manager ()
|
||||||
_bundle_manager->show ();
|
_bundle_manager->show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Editor::show_global_port_matrix (ARDOUR::DataType t)
|
||||||
|
{
|
||||||
|
if (_global_port_matrix[t] == 0) {
|
||||||
|
_global_port_matrix[t] = new GlobalPortMatrixWindow (*session, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
_global_port_matrix[t]->show ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::first_idle ()
|
Editor::first_idle ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,7 @@ class SoundFileOmega;
|
||||||
class RhythmFerret;
|
class RhythmFerret;
|
||||||
class AnalysisWindow;
|
class AnalysisWindow;
|
||||||
class BundleManager;
|
class BundleManager;
|
||||||
|
class GlobalPortMatrixWindow;
|
||||||
|
|
||||||
/* <CMT Additions> */
|
/* <CMT Additions> */
|
||||||
class ImageFrameView;
|
class ImageFrameView;
|
||||||
|
|
@ -396,6 +397,7 @@ class Editor : public PublicEditor
|
||||||
|
|
||||||
void show_rhythm_ferret();
|
void show_rhythm_ferret();
|
||||||
void show_bundle_manager ();
|
void show_bundle_manager ();
|
||||||
|
void show_global_port_matrix (ARDOUR::DataType);
|
||||||
|
|
||||||
void goto_visual_state (uint32_t);
|
void goto_visual_state (uint32_t);
|
||||||
void save_visual_state (uint32_t);
|
void save_visual_state (uint32_t);
|
||||||
|
|
@ -2350,6 +2352,7 @@ public:
|
||||||
|
|
||||||
RhythmFerret* rhythm_ferret;
|
RhythmFerret* rhythm_ferret;
|
||||||
BundleManager* _bundle_manager;
|
BundleManager* _bundle_manager;
|
||||||
|
GlobalPortMatrixWindow* _global_port_matrix[ARDOUR::DataType::num_types];
|
||||||
|
|
||||||
void fit_tracks ();
|
void fit_tracks ();
|
||||||
void set_track_height (uint32_t h);
|
void set_track_height (uint32_t h);
|
||||||
|
|
|
||||||
|
|
@ -564,6 +564,11 @@ Editor::register_actions ()
|
||||||
act = ActionManager::register_action (editor_actions, "toggle-rhythm-ferret", _("Rhythm Ferret"), mem_fun(*this, &Editor::show_rhythm_ferret));
|
act = ActionManager::register_action (editor_actions, "toggle-rhythm-ferret", _("Rhythm Ferret"), mem_fun(*this, &Editor::show_rhythm_ferret));
|
||||||
ActionManager::session_sensitive_actions.push_back (act);
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
act = ActionManager::register_action (editor_actions, "toggle-bundle-manager", _("Bundle Manager"), mem_fun (*this, &Editor::show_bundle_manager));
|
act = ActionManager::register_action (editor_actions, "toggle-bundle-manager", _("Bundle Manager"), mem_fun (*this, &Editor::show_bundle_manager));
|
||||||
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
act = ActionManager::register_action (editor_actions, "toggle-audio-connection-manager", _("Audio Connection Manager"), bind (mem_fun (*this, &Editor::show_global_port_matrix), ARDOUR::DataType::AUDIO));
|
||||||
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
act = ActionManager::register_action (editor_actions, "toggle-midi-connection-manager", _("MIDI Connection Manager"), bind (mem_fun (*this, &Editor::show_global_port_matrix), ARDOUR::DataType::MIDI));
|
||||||
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
|
||||||
act = ActionManager::register_action (editor_actions, "tab-to-transient-forwards", _("Move Forward to Transient"), bind (mem_fun(*this, &Editor::tab_to_transient), true));
|
act = ActionManager::register_action (editor_actions, "tab-to-transient-forwards", _("Move Forward to Transient"), bind (mem_fun(*this, &Editor::tab_to_transient), true));
|
||||||
ActionManager::session_sensitive_actions.push_back (act);
|
ActionManager::session_sensitive_actions.push_back (act);
|
||||||
|
|
|
||||||
144
gtk2_ardour/global_port_matrix.cc
Normal file
144
gtk2_ardour/global_port_matrix.cc
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "global_port_matrix.h"
|
||||||
|
#include "i18n.h"
|
||||||
|
#include "ardour/bundle.h"
|
||||||
|
#include "ardour/session.h"
|
||||||
|
#include "ardour/audioengine.h"
|
||||||
|
#include "ardour/port.h"
|
||||||
|
|
||||||
|
GlobalPortMatrix::GlobalPortMatrix (ARDOUR::Session& s, ARDOUR::DataType t)
|
||||||
|
: PortMatrix (s, t, true, PortGroupList::Mask (PortGroupList::BUSS |
|
||||||
|
PortGroupList::TRACK |
|
||||||
|
PortGroupList::SYSTEM |
|
||||||
|
PortGroupList::OTHER)),
|
||||||
|
_session (s),
|
||||||
|
_our_port_group_list (s, t, false, PortGroupList::Mask (PortGroupList::BUSS |
|
||||||
|
PortGroupList::TRACK |
|
||||||
|
PortGroupList::SYSTEM |
|
||||||
|
PortGroupList::OTHER))
|
||||||
|
{
|
||||||
|
setup ();
|
||||||
|
|
||||||
|
_port_group_list.VisibilityChanged.connect (sigc::mem_fun (*this, &GlobalPortMatrix::group_visibility_changed));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GlobalPortMatrix::group_visibility_changed ()
|
||||||
|
{
|
||||||
|
_our_port_group_list.take_visibility_from (_port_group_list);
|
||||||
|
setup ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
GlobalPortMatrix::setup ()
|
||||||
|
{
|
||||||
|
_our_port_group_list.refresh ();
|
||||||
|
_our_bundles = _our_port_group_list.bundles ();
|
||||||
|
|
||||||
|
PortMatrix::setup ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GlobalPortMatrix::set_state (
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
|
uint32_t ac,
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle> bb,
|
||||||
|
uint32_t bc,
|
||||||
|
bool s,
|
||||||
|
uint32_t k
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ARDOUR::Bundle::PortList const& our_ports = ab->channel_ports (ac);
|
||||||
|
ARDOUR::Bundle::PortList const& other_ports = bb->channel_ports (bc);
|
||||||
|
|
||||||
|
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
|
||||||
|
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
|
||||||
|
|
||||||
|
ARDOUR::Port* p = _session.engine().get_port_by_name (*i);
|
||||||
|
ARDOUR::Port* q = _session.engine().get_port_by_name (*j);
|
||||||
|
|
||||||
|
if (p) {
|
||||||
|
if (s) {
|
||||||
|
p->connect (*j);
|
||||||
|
} else {
|
||||||
|
p->disconnect (*j);
|
||||||
|
}
|
||||||
|
} else if (q) {
|
||||||
|
if (s) {
|
||||||
|
q->connect (*i);
|
||||||
|
} else {
|
||||||
|
q->disconnect (*j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we don't handle connections between two non-Ardour ports */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PortMatrix::State
|
||||||
|
GlobalPortMatrix::get_state (
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
|
uint32_t ac,
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle> bb,
|
||||||
|
uint32_t bc
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
ARDOUR::Bundle::PortList const& our_ports = ab->channel_ports (ac);
|
||||||
|
ARDOUR::Bundle::PortList const& other_ports = bb->channel_ports (bc);
|
||||||
|
|
||||||
|
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {
|
||||||
|
for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
|
||||||
|
|
||||||
|
ARDOUR::Port* p = _session.engine().get_port_by_name (*i);
|
||||||
|
ARDOUR::Port* q = _session.engine().get_port_by_name (*j);
|
||||||
|
|
||||||
|
/* we don't know the state of connections between two non-Ardour ports */
|
||||||
|
if (!p && !q) {
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p && p->connected_to (*j) == false) {
|
||||||
|
return NOT_ASSOCIATED;
|
||||||
|
} else if (q && q->connected_to (*i) == false) {
|
||||||
|
return NOT_ASSOCIATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ASSOCIATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GlobalPortMatrixWindow::GlobalPortMatrixWindow (ARDOUR::Session& s, ARDOUR::DataType t)
|
||||||
|
: ArdourDialog (
|
||||||
|
t == ARDOUR::DataType::AUDIO ?
|
||||||
|
_("Audio Connections Manager") :
|
||||||
|
_("MIDI Connections Manager")),
|
||||||
|
_port_matrix (s, t)
|
||||||
|
{
|
||||||
|
get_vbox()->pack_start (_port_matrix);
|
||||||
|
show_all ();
|
||||||
|
}
|
||||||
76
gtk2_ardour/global_port_matrix.h
Normal file
76
gtk2_ardour/global_port_matrix.h
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2009 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ardour_gtk_global_port_matrix_h__
|
||||||
|
#define __ardour_gtk_global_port_matrix_h__
|
||||||
|
|
||||||
|
#include "port_matrix.h"
|
||||||
|
#include "port_group.h"
|
||||||
|
#include "ardour_dialog.h"
|
||||||
|
|
||||||
|
class GlobalPortMatrix : public PortMatrix
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GlobalPortMatrix (ARDOUR::Session&, ARDOUR::DataType);
|
||||||
|
|
||||||
|
void setup ();
|
||||||
|
|
||||||
|
void set_state (
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
|
uint32_t,
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
|
uint32_t,
|
||||||
|
bool,
|
||||||
|
uint32_t
|
||||||
|
);
|
||||||
|
|
||||||
|
State get_state (
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
|
uint32_t,
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
|
uint32_t
|
||||||
|
) const;
|
||||||
|
|
||||||
|
void add_channel (boost::shared_ptr<ARDOUR::Bundle>) {}
|
||||||
|
void remove_channel (boost::shared_ptr<ARDOUR::Bundle>, uint32_t) {}
|
||||||
|
bool can_rename_channels () const {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void group_visibility_changed ();
|
||||||
|
|
||||||
|
ARDOUR::Session& _session;
|
||||||
|
PortGroupList _our_port_group_list;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class GlobalPortMatrixWindow : public ArdourDialog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GlobalPortMatrixWindow (ARDOUR::Session&, ARDOUR::DataType);
|
||||||
|
|
||||||
|
private:
|
||||||
|
GlobalPortMatrix _port_matrix;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -58,8 +58,9 @@ IOSelector::IOSelector (ARDOUR::Session& session, boost::shared_ptr<ARDOUR::IO>
|
||||||
void
|
void
|
||||||
IOSelector::setup ()
|
IOSelector::setup ()
|
||||||
{
|
{
|
||||||
_our_bundle = boost::shared_ptr<ARDOUR::Bundle> (new ARDOUR::Bundle);
|
_our_bundles.clear ();
|
||||||
_our_bundle->set_name (_io->name());
|
_our_bundles.push_back (boost::shared_ptr<ARDOUR::Bundle> (new ARDOUR::Bundle));
|
||||||
|
_our_bundles.front()->set_name (_io->name());
|
||||||
|
|
||||||
if (offering_input ()) {
|
if (offering_input ()) {
|
||||||
const PortSet& ps (_io->outputs());
|
const PortSet& ps (_io->outputs());
|
||||||
|
|
@ -68,8 +69,8 @@ IOSelector::setup ()
|
||||||
for (PortSet::const_iterator i = ps.begin(); i != ps.end(); ++i) {
|
for (PortSet::const_iterator i = ps.begin(); i != ps.end(); ++i) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
snprintf (buf, sizeof(buf), _("out %d"), j + 1);
|
snprintf (buf, sizeof(buf), _("out %d"), j + 1);
|
||||||
_our_bundle->add_channel (buf);
|
_our_bundles.front()->add_channel (buf);
|
||||||
_our_bundle->add_port_to_channel (j, _session.engine().make_port_name_non_relative (i->name()));
|
_our_bundles.front()->add_port_to_channel (j, _session.engine().make_port_name_non_relative (i->name()));
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -81,8 +82,8 @@ IOSelector::setup ()
|
||||||
for (PortSet::const_iterator i = ps.begin(); i != ps.end(); ++i) {
|
for (PortSet::const_iterator i = ps.begin(); i != ps.end(); ++i) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
snprintf (buf, sizeof(buf), _("in %d"), j + 1);
|
snprintf (buf, sizeof(buf), _("in %d"), j + 1);
|
||||||
_our_bundle->add_channel (buf);
|
_our_bundles.front()->add_channel (buf);
|
||||||
_our_bundle->add_port_to_channel (j, _session.engine().make_port_name_non_relative (i->name()));
|
_our_bundles.front()->add_port_to_channel (j, _session.engine().make_port_name_non_relative (i->name()));
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,7 +138,7 @@ IOSelector::set_state (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
PortMatrix::State
|
||||||
IOSelector::get_state (
|
IOSelector::get_state (
|
||||||
boost::shared_ptr<ARDOUR::Bundle> ab,
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
uint32_t ac,
|
uint32_t ac,
|
||||||
|
|
@ -159,12 +160,12 @@ IOSelector::get_state (
|
||||||
|
|
||||||
if (!f->connected_to (*j)) {
|
if (!f->connected_to (*j)) {
|
||||||
/* if any one thing is not connected, all bets are off */
|
/* if any one thing is not connected, all bets are off */
|
||||||
return false;
|
return NOT_ASSOCIATED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return ASSOCIATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
|
|
@ -318,11 +319,6 @@ IOSelectorWindow::IOSelectorWindow (ARDOUR::Session& session, boost::shared_ptr<
|
||||||
signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), this));
|
signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
IOSelectorWindow::~IOSelectorWindow()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
IOSelectorWindow::ports_changed ()
|
IOSelectorWindow::ports_changed ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ class IOSelector : public PortMatrix {
|
||||||
uint32_t
|
uint32_t
|
||||||
);
|
);
|
||||||
|
|
||||||
bool get_state (
|
State get_state (
|
||||||
boost::shared_ptr<ARDOUR::Bundle>,
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
uint32_t,
|
uint32_t,
|
||||||
boost::shared_ptr<ARDOUR::Bundle>,
|
boost::shared_ptr<ARDOUR::Bundle>,
|
||||||
|
|
@ -70,7 +70,6 @@ class IOSelectorWindow : public ArdourDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IOSelectorWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>, bool for_input, bool can_cancel = false);
|
IOSelectorWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>, bool for_input, bool can_cancel = false);
|
||||||
~IOSelectorWindow ();
|
|
||||||
|
|
||||||
IOSelector& selector() { return _selector; }
|
IOSelector& selector() { return _selector; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ PortGroupUI::PortGroupUI (PortMatrix* m, PortGroup* g)
|
||||||
, _port_group (g)
|
, _port_group (g)
|
||||||
, _visibility_checkbutton (g->name)
|
, _visibility_checkbutton (g->name)
|
||||||
{
|
{
|
||||||
_port_group->visible = true;
|
_port_group->set_visible (true);
|
||||||
setup_visibility_checkbutton ();
|
setup_visibility_checkbutton ();
|
||||||
|
|
||||||
_visibility_checkbutton.signal_toggled().connect (sigc::mem_fun (*this, &PortGroupUI::visibility_checkbutton_toggled));
|
_visibility_checkbutton.signal_toggled().connect (sigc::mem_fun (*this, &PortGroupUI::visibility_checkbutton_toggled));
|
||||||
|
|
@ -77,7 +77,7 @@ PortGroupUI::PortGroupUI (PortMatrix* m, PortGroup* g)
|
||||||
void
|
void
|
||||||
PortGroupUI::visibility_checkbutton_toggled ()
|
PortGroupUI::visibility_checkbutton_toggled ()
|
||||||
{
|
{
|
||||||
_port_group->visible = _visibility_checkbutton.get_active ();
|
_port_group->set_visible (_visibility_checkbutton.get_active ());
|
||||||
setup_visibility_checkbutton ();
|
setup_visibility_checkbutton ();
|
||||||
_port_matrix->setup ();
|
_port_matrix->setup ();
|
||||||
}
|
}
|
||||||
|
|
@ -86,8 +86,8 @@ PortGroupUI::visibility_checkbutton_toggled ()
|
||||||
void
|
void
|
||||||
PortGroupUI::setup_visibility_checkbutton ()
|
PortGroupUI::setup_visibility_checkbutton ()
|
||||||
{
|
{
|
||||||
if (_visibility_checkbutton.get_active () != _port_group->visible) {
|
if (_visibility_checkbutton.get_active () != _port_group->visible()) {
|
||||||
_visibility_checkbutton.set_active (_port_group->visible);
|
_visibility_checkbutton.set_active (_port_group->visible());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -106,6 +106,10 @@ PortGroupList::PortGroupList (ARDOUR::Session & session, ARDOUR::DataType type,
|
||||||
_other (_("Other"), mask & OTHER)
|
_other (_("Other"), mask & OTHER)
|
||||||
{
|
{
|
||||||
refresh ();
|
refresh ();
|
||||||
|
|
||||||
|
for (iterator i = begin(); i != end(); ++i) {
|
||||||
|
(*i)->VisibilityChanged.connect (sigc::mem_fun (*this, &PortGroupList::visibility_changed));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Find or re-find all our bundles and set up our lists */
|
/** Find or re-find all our bundles and set up our lists */
|
||||||
|
|
@ -213,3 +217,94 @@ PortGroupList::maybe_add_session_bundle (boost::shared_ptr<ARDOUR::Bundle> b)
|
||||||
_system.bundles.push_back (b);
|
_system.bundles.push_back (b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<boost::shared_ptr<ARDOUR::Bundle> >
|
||||||
|
PortGroupList::bundles ()
|
||||||
|
{
|
||||||
|
std::vector<boost::shared_ptr<ARDOUR::Bundle> > bundles;
|
||||||
|
|
||||||
|
for (iterator i = begin (); i != end (); ++i) {
|
||||||
|
if ((*i)->visible()) {
|
||||||
|
|
||||||
|
std::copy ((*i)->bundles.begin(), (*i)->bundles.end(), std::back_inserter (bundles));
|
||||||
|
|
||||||
|
/* make a bundle for the ports, if there are any */
|
||||||
|
if (!(*i)->ports.empty()) {
|
||||||
|
|
||||||
|
boost::shared_ptr<ARDOUR::Bundle> b (new ARDOUR::Bundle ("", _type, !_offer_inputs));
|
||||||
|
|
||||||
|
std::string const pre = common_prefix ((*i)->ports);
|
||||||
|
if (!pre.empty()) {
|
||||||
|
b->set_name (pre.substr (0, pre.length() - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t j = 0; j < (*i)->ports.size(); ++j) {
|
||||||
|
std::string const p = (*i)->ports[j];
|
||||||
|
b->add_channel (p.substr (pre.length()));
|
||||||
|
b->set_port (j, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
bundles.push_back (b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bundles;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
PortGroupList::common_prefix (std::vector<std::string> const & p) const
|
||||||
|
{
|
||||||
|
/* common prefix before '/' ? */
|
||||||
|
if (p[0].find_first_of ("/") != std::string::npos) {
|
||||||
|
std::string const fp = p[0].substr (0, (p[0].find_first_of ("/") + 1));
|
||||||
|
uint32_t j = 1;
|
||||||
|
while (j < p.size()) {
|
||||||
|
if (p[j].substr (0, fp.length()) != fp) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == p.size()) {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* or before ':' ? */
|
||||||
|
if (p[0].find_first_of (":") != std::string::npos) {
|
||||||
|
std::string const fp = p[0].substr (0, (p[0].find_first_of (":") + 1));
|
||||||
|
uint32_t j = 1;
|
||||||
|
while (j < p.size()) {
|
||||||
|
if (p[j].substr (0, fp.length()) != fp) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == p.size()) {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PortGroupList::visibility_changed ()
|
||||||
|
{
|
||||||
|
VisibilityChanged ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PortGroupList::take_visibility_from (PortGroupList const & o)
|
||||||
|
{
|
||||||
|
iterator i = begin ();
|
||||||
|
const_iterator j = o.begin ();
|
||||||
|
|
||||||
|
while (i != end() && j != o.end()) {
|
||||||
|
(*i)->set_visible ((*j)->visible());
|
||||||
|
++i;
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,15 +38,15 @@ class PortMatrix;
|
||||||
* type e.g. busses, tracks, system. Each group has 0 or more bundles
|
* type e.g. busses, tracks, system. Each group has 0 or more bundles
|
||||||
* and 0 or more ports, where the ports are not in the bundles.
|
* and 0 or more ports, where the ports are not in the bundles.
|
||||||
*/
|
*/
|
||||||
class PortGroup
|
class PortGroup : public sigc::trackable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** PortGroup constructor.
|
/** PortGroup constructor.
|
||||||
* @param n Name.
|
* @param n Name.
|
||||||
* @param v true if group should be visible in the UI, otherwise false.
|
* @param v true if group should be visible in the UI, otherwise false.
|
||||||
*/
|
*/
|
||||||
PortGroup (std::string const & n, bool v)
|
PortGroup (std::string const & n, bool v)
|
||||||
: name (n), visible (v) {}
|
: name (n), _visible (v) {}
|
||||||
|
|
||||||
void add_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
void add_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
||||||
void add_port (std::string const &);
|
void add_port (std::string const &);
|
||||||
|
|
@ -55,7 +55,19 @@ class PortGroup
|
||||||
std::string name; ///< name for the group
|
std::string name; ///< name for the group
|
||||||
std::vector<boost::shared_ptr<ARDOUR::Bundle> > bundles;
|
std::vector<boost::shared_ptr<ARDOUR::Bundle> > bundles;
|
||||||
std::vector<std::string> ports;
|
std::vector<std::string> ports;
|
||||||
bool visible; ///< true if the group is visible in the UI
|
bool visible () const {
|
||||||
|
return _visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_visible (bool v) {
|
||||||
|
_visible = v;
|
||||||
|
VisibilityChanged ();
|
||||||
|
}
|
||||||
|
|
||||||
|
sigc::signal<void> VisibilityChanged;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _visible; ///< true if the group is visible in the UI
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The UI for a PortGroup
|
/// The UI for a PortGroup
|
||||||
|
|
@ -78,7 +90,7 @@ class PortGroupUI
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A list of PortGroups
|
/// A list of PortGroups
|
||||||
class PortGroupList : public std::list<PortGroup*>
|
class PortGroupList : public std::list<PortGroup*>, public sigc::trackable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum Mask {
|
enum Mask {
|
||||||
|
|
@ -93,9 +105,15 @@ class PortGroupList : public std::list<PortGroup*>
|
||||||
void refresh ();
|
void refresh ();
|
||||||
void set_type (ARDOUR::DataType);
|
void set_type (ARDOUR::DataType);
|
||||||
void set_offer_inputs (bool);
|
void set_offer_inputs (bool);
|
||||||
|
std::vector<boost::shared_ptr<ARDOUR::Bundle> > bundles ();
|
||||||
|
void take_visibility_from (PortGroupList const &);
|
||||||
|
|
||||||
|
sigc::signal<void> VisibilityChanged;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void maybe_add_session_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
void maybe_add_session_bundle (boost::shared_ptr<ARDOUR::Bundle>);
|
||||||
|
std::string common_prefix (std::vector<std::string> const &) const;
|
||||||
|
void visibility_changed ();
|
||||||
|
|
||||||
ARDOUR::Session& _session;
|
ARDOUR::Session& _session;
|
||||||
ARDOUR::DataType _type;
|
ARDOUR::DataType _type;
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@
|
||||||
* @param mask Mask of port groups to offer.
|
* @param mask Mask of port groups to offer.
|
||||||
*/
|
*/
|
||||||
PortMatrix::PortMatrix (ARDOUR::Session& session, ARDOUR::DataType type, bool offer_inputs, PortGroupList::Mask mask)
|
PortMatrix::PortMatrix (ARDOUR::Session& session, ARDOUR::DataType type, bool offer_inputs, PortGroupList::Mask mask)
|
||||||
: _offer_inputs (offer_inputs),
|
: _port_group_list (session, type, offer_inputs, mask),
|
||||||
_port_group_list (session, type, offer_inputs, mask),
|
_offer_inputs (offer_inputs),
|
||||||
_type (type),
|
_type (type),
|
||||||
_body (this, offer_inputs ? PortMatrixBody::BOTTOM_AND_LEFT : PortMatrixBody::TOP_AND_RIGHT)
|
_body (this, offer_inputs ? PortMatrixBody::BOTTOM_AND_LEFT : PortMatrixBody::TOP_AND_RIGHT)
|
||||||
{
|
{
|
||||||
|
|
@ -77,39 +77,7 @@ void
|
||||||
PortMatrix::setup ()
|
PortMatrix::setup ()
|
||||||
{
|
{
|
||||||
_port_group_list.refresh ();
|
_port_group_list.refresh ();
|
||||||
|
_body.setup (_our_bundles, _port_group_list.bundles ());
|
||||||
std::vector<boost::shared_ptr<ARDOUR::Bundle> > column;
|
|
||||||
std::vector<boost::shared_ptr<ARDOUR::Bundle> > row;
|
|
||||||
|
|
||||||
for (PortGroupList::iterator i = _port_group_list.begin (); i != _port_group_list.end (); ++i) {
|
|
||||||
if ((*i)->visible) {
|
|
||||||
|
|
||||||
std::copy ((*i)->bundles.begin(), (*i)->bundles.end(), std::back_inserter (column));
|
|
||||||
|
|
||||||
/* make a bundle for the ports, if there are any */
|
|
||||||
if (!(*i)->ports.empty()) {
|
|
||||||
|
|
||||||
boost::shared_ptr<ARDOUR::Bundle> b (new ARDOUR::Bundle ("", _type, !_offer_inputs));
|
|
||||||
|
|
||||||
std::string const pre = common_prefix ((*i)->ports);
|
|
||||||
if (!pre.empty()) {
|
|
||||||
b->set_name (pre.substr (0, pre.length() - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t j = 0; j < (*i)->ports.size(); ++j) {
|
|
||||||
std::string const p = (*i)->ports[j];
|
|
||||||
b->add_channel (p.substr (pre.length()));
|
|
||||||
b->set_port (j, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
column.push_back (b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
row.push_back (_our_bundle);
|
|
||||||
|
|
||||||
_body.setup (row, column);
|
|
||||||
setup_scrollbars ();
|
setup_scrollbars ();
|
||||||
queue_draw ();
|
queue_draw ();
|
||||||
}
|
}
|
||||||
|
|
@ -160,44 +128,6 @@ PortMatrix::setup_scrollbars ()
|
||||||
a->set_page_increment (128);
|
a->set_page_increment (128);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
|
||||||
PortMatrix::common_prefix (std::vector<std::string> const & p) const
|
|
||||||
{
|
|
||||||
/* common prefix before '/' ? */
|
|
||||||
if (p[0].find_first_of ("/") != std::string::npos) {
|
|
||||||
std::string const fp = p[0].substr (0, (p[0].find_first_of ("/") + 1));
|
|
||||||
uint32_t j = 1;
|
|
||||||
while (j < p.size()) {
|
|
||||||
if (p[j].substr (0, fp.length()) != fp) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == p.size()) {
|
|
||||||
return fp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* or before ':' ? */
|
|
||||||
if (p[0].find_first_of (":") != std::string::npos) {
|
|
||||||
std::string const fp = p[0].substr (0, (p[0].find_first_of (":") + 1));
|
|
||||||
uint32_t j = 1;
|
|
||||||
while (j < p.size()) {
|
|
||||||
if (p[j].substr (0, fp.length()) != fp) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (j == p.size()) {
|
|
||||||
return fp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PortMatrix::disassociate_all ()
|
PortMatrix::disassociate_all ()
|
||||||
{
|
{
|
||||||
|
|
@ -207,10 +137,10 @@ PortMatrix::disassociate_all ()
|
||||||
|
|
||||||
for (uint32_t k = 0; k < (*j)->nchannels(); ++k) {
|
for (uint32_t k = 0; k < (*j)->nchannels(); ++k) {
|
||||||
|
|
||||||
for (uint32_t l = 0; l < _our_bundle->nchannels(); ++l) {
|
for (uint32_t l = 0; l < _our_bundles.front()->nchannels(); ++l) {
|
||||||
|
|
||||||
set_state (
|
set_state (
|
||||||
_our_bundle, l, *j, k, false, 0
|
_our_bundles.front(), l, *j, k, false, 0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,13 +78,19 @@ public:
|
||||||
uint32_t k
|
uint32_t k
|
||||||
) = 0;
|
) = 0;
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
ASSOCIATED,
|
||||||
|
NOT_ASSOCIATED,
|
||||||
|
UNKNOWN
|
||||||
|
};
|
||||||
|
|
||||||
/** @param ab Our bundle.
|
/** @param ab Our bundle.
|
||||||
* @param ac Channel on our bundle.
|
* @param ac Channel on our bundle.
|
||||||
* @param bb Other bundle.
|
* @param bb Other bundle.
|
||||||
* @arapm bc Channel on other bundle.
|
* @arapm bc Channel on other bundle.
|
||||||
* @return true if r is connected to p, otherwise false.
|
* @return state
|
||||||
*/
|
*/
|
||||||
virtual bool get_state (
|
virtual State get_state (
|
||||||
boost::shared_ptr<ARDOUR::Bundle> ab,
|
boost::shared_ptr<ARDOUR::Bundle> ab,
|
||||||
uint32_t ac,
|
uint32_t ac,
|
||||||
boost::shared_ptr<ARDOUR::Bundle> bb,
|
boost::shared_ptr<ARDOUR::Bundle> bb,
|
||||||
|
|
@ -99,19 +105,18 @@ public:
|
||||||
void setup_scrollbars ();
|
void setup_scrollbars ();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// our bundle
|
|
||||||
boost::shared_ptr<ARDOUR::Bundle> _our_bundle;
|
std::vector<boost::shared_ptr<ARDOUR::Bundle> > _our_bundles;
|
||||||
|
/// list of port groups
|
||||||
|
PortGroupList _port_group_list;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void hscroll_changed ();
|
void hscroll_changed ();
|
||||||
void vscroll_changed ();
|
void vscroll_changed ();
|
||||||
std::string common_prefix (std::vector<std::string> const &) const;
|
|
||||||
|
|
||||||
/// true to offer inputs, otherwise false
|
/// true to offer inputs, otherwise false
|
||||||
bool _offer_inputs;
|
bool _offer_inputs;
|
||||||
/// list of port groups
|
|
||||||
PortGroupList _port_group_list;
|
|
||||||
/// port type that we are working with
|
/// port type that we are working with
|
||||||
ARDOUR::DataType _type;
|
ARDOUR::DataType _type;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -187,7 +187,7 @@ PortMatrixBody::compute_rectangles ()
|
||||||
|
|
||||||
_grid_rect.set_x (_alloc_width - x);
|
_grid_rect.set_x (_alloc_width - x);
|
||||||
_grid_rect.set_width (x);
|
_grid_rect.set_width (x);
|
||||||
_column_labels_rect.set_width (std::min (_alloc_width, col.first));
|
_column_labels_rect.set_width (col.first - grid.first + x);
|
||||||
_column_labels_rect.set_x (_alloc_width - _column_labels_rect.get_width());
|
_column_labels_rect.set_x (_alloc_width - _column_labels_rect.get_width());
|
||||||
|
|
||||||
_row_labels_rect.set_width (std::min (_alloc_width - x, row.first));
|
_row_labels_rect.set_width (std::min (_alloc_width - x, row.first));
|
||||||
|
|
|
||||||
|
|
@ -90,26 +90,31 @@ protected:
|
||||||
|
|
||||||
/* XXX I guess these colours should come from a theme, or something */
|
/* XXX I guess these colours should come from a theme, or something */
|
||||||
|
|
||||||
/* @return background colour */
|
/** @return background colour */
|
||||||
static Gdk::Color background_colour () {
|
static Gdk::Color background_colour () {
|
||||||
return Gdk::Color ("#000000");
|
return Gdk::Color ("#000000");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @return text colour */
|
/** @return text colour */
|
||||||
static Gdk::Color text_colour () {
|
static Gdk::Color text_colour () {
|
||||||
return Gdk::Color ("#ffffff");
|
return Gdk::Color ("#ffffff");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @return grid line colour */
|
/** @return grid line colour */
|
||||||
static Gdk::Color grid_colour () {
|
static Gdk::Color grid_colour () {
|
||||||
return Gdk::Color ("#333333");
|
return Gdk::Color ("#333333");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @return colour of association blobs */
|
/** @return colour of association blobs */
|
||||||
static Gdk::Color association_colour () {
|
static Gdk::Color association_colour () {
|
||||||
return Gdk::Color ("#00ff00");
|
return Gdk::Color ("#00ff00");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return colour to paint grid squares when they can't be associated */
|
||||||
|
static Gdk::Color unknown_colour () {
|
||||||
|
return Gdk::Color ("#cccccc");
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX */
|
/* XXX */
|
||||||
static Gdk::Color get_a_bundle_colour (int x) {
|
static Gdk::Color get_a_bundle_colour (int x) {
|
||||||
if ((x % 2) == 0) {
|
if ((x % 2) == 0) {
|
||||||
|
|
|
||||||
|
|
@ -117,8 +117,10 @@ PortMatrixGrid::render (cairo_t* cr)
|
||||||
y = by;
|
y = by;
|
||||||
for (uint32_t l = 0; l < (*j)->nchannels (); ++l) {
|
for (uint32_t l = 0; l < (*j)->nchannels (); ++l) {
|
||||||
|
|
||||||
if (_port_matrix->get_state (*j, l, *i, k)) {
|
PortMatrix::State const s = _port_matrix->get_state (*j, l, *i, k);
|
||||||
|
|
||||||
|
switch (s) {
|
||||||
|
case PortMatrix::ASSOCIATED:
|
||||||
set_source_rgba (cr, association_colour(), 0.5);
|
set_source_rgba (cr, association_colour(), 0.5);
|
||||||
cairo_arc (
|
cairo_arc (
|
||||||
cr,
|
cr,
|
||||||
|
|
@ -130,8 +132,24 @@ PortMatrixGrid::render (cairo_t* cr)
|
||||||
);
|
);
|
||||||
|
|
||||||
cairo_fill (cr);
|
cairo_fill (cr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PortMatrix::UNKNOWN:
|
||||||
|
set_source_rgba (cr, unknown_colour(), 0.5);
|
||||||
|
cairo_rectangle (
|
||||||
|
cr,
|
||||||
|
x + thick_grid_line_width(),
|
||||||
|
y + thick_grid_line_width(),
|
||||||
|
column_width() - 2 * thick_grid_line_width(),
|
||||||
|
row_height() - 2 * thick_grid_line_width()
|
||||||
|
);
|
||||||
|
cairo_fill (cr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PortMatrix::NOT_ASSOCIATED:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
y += row_height();
|
y += row_height();
|
||||||
}
|
}
|
||||||
x += column_width();
|
x += column_width();
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ class AudioEngine : public sigc::trackable
|
||||||
int connect (const std::string& source, const std::string& destination);
|
int connect (const std::string& source, const std::string& destination);
|
||||||
int disconnect (const std::string& source, const std::string& destination);
|
int disconnect (const std::string& source, const std::string& destination);
|
||||||
int disconnect (Port &);
|
int disconnect (Port &);
|
||||||
|
bool ports_connected (std::string const &, std::string const &);
|
||||||
|
|
||||||
const char ** get_ports (const std::string& port_name_pattern, const std::string& type_name_pattern, uint32_t flags);
|
const char ** get_ports (const std::string& port_name_pattern, const std::string& type_name_pattern, uint32_t flags);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -695,28 +695,13 @@ AudioEngine::connect (const string& source, const string& destination)
|
||||||
Port* src = get_port_by_name_locked (s);
|
Port* src = get_port_by_name_locked (s);
|
||||||
Port* dst = get_port_by_name_locked (d);
|
Port* dst = get_port_by_name_locked (d);
|
||||||
|
|
||||||
if (src && dst) {
|
|
||||||
|
|
||||||
/* both ports are known to us, so do the internal connect stuff */
|
|
||||||
|
|
||||||
ret = src->connect (dst);
|
|
||||||
|
|
||||||
} else if (src || dst) {
|
|
||||||
|
|
||||||
/* one port is known to us, try to connect it to something external */
|
|
||||||
|
|
||||||
if (src) {
|
if (src) {
|
||||||
ret = src->connect (d);
|
ret = src->connect (d);
|
||||||
} else {
|
} else if (dst) {
|
||||||
ret = dst->connect (s);
|
ret = dst->connect (s);
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* neither port is known to us, and this API isn't intended for use as a general patch bay */
|
/* neither port is known to us, and this API isn't intended for use as a general patch bay */
|
||||||
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
|
|
@ -754,30 +739,14 @@ AudioEngine::disconnect (const string& source, const string& destination)
|
||||||
Port* src = get_port_by_name_locked (s);
|
Port* src = get_port_by_name_locked (s);
|
||||||
Port* dst = get_port_by_name_locked (d);
|
Port* dst = get_port_by_name_locked (d);
|
||||||
|
|
||||||
if (src && dst) {
|
|
||||||
|
|
||||||
/* both ports are known to us, so do the internal disconnect stuff */
|
|
||||||
|
|
||||||
ret = src->disconnect (dst);
|
|
||||||
|
|
||||||
} else if (src || dst) {
|
|
||||||
|
|
||||||
/* one port is known to us, try to disconnect it from something external */
|
|
||||||
|
|
||||||
if (src) {
|
if (src) {
|
||||||
ret = src->disconnect (d);
|
ret = src->disconnect (d);
|
||||||
} else {
|
} else if (dst) {
|
||||||
ret = dst->disconnect (s);
|
ret = dst->disconnect (s);
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* neither port is known to us, and this API isn't intended for use as a general patch bay */
|
/* neither port is known to us, and this API isn't intended for use as a general patch bay */
|
||||||
|
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue