Clean up and comment PortMatrix event handling a bit.

Fix problems with attempts to access Session after it has been
destroyed.


git-svn-id: svn://localhost/ardour2/branches/3.0@6290 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-12-05 03:04:54 +00:00
parent bdf5dead24
commit abd80d0f64
18 changed files with 130 additions and 92 deletions

View file

@ -340,7 +340,7 @@ void
ARDOUR_UI::create_bundle_manager () ARDOUR_UI::create_bundle_manager ()
{ {
if (bundle_manager == 0) { if (bundle_manager == 0) {
bundle_manager = new BundleManager (*session); bundle_manager = new BundleManager (session);
bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager"))); bundle_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBundleManager")));
} }
} }

View file

@ -35,7 +35,7 @@ using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
BundleEditorMatrix::BundleEditorMatrix ( BundleEditorMatrix::BundleEditorMatrix (
Gtk::Window* parent, Session& session, boost::shared_ptr<Bundle> bundle Gtk::Window* parent, Session* session, boost::shared_ptr<Bundle> bundle
) )
: PortMatrix (parent, session, bundle->type()), : PortMatrix (parent, session, bundle->type()),
_bundle (bundle) _bundle (bundle)
@ -174,7 +174,7 @@ BundleEditorMatrix::list_is_global (int dim) const
return (dim == OTHER); return (dim == OTHER);
} }
BundleEditor::BundleEditor (Session& session, boost::shared_ptr<UserBundle> bundle) BundleEditor::BundleEditor (Session* session, boost::shared_ptr<UserBundle> bundle)
: ArdourDialog (_("Edit Bundle")), _matrix (this, session, bundle), _bundle (bundle) : ArdourDialog (_("Edit Bundle")), _matrix (this, session, bundle), _bundle (bundle)
{ {
Gtk::Table* t = new Gtk::Table (3, 2); Gtk::Table* t = new Gtk::Table (3, 2);
@ -284,7 +284,7 @@ BundleEditor::on_map ()
} }
BundleManager::BundleManager (Session& session) BundleManager::BundleManager (Session* session)
: ArdourDialog (_("Bundle Manager")), _session (session), edit_button (_("Edit")), delete_button (_("Delete")) : ArdourDialog (_("Bundle Manager")), _session (session), edit_button (_("Edit")), delete_button (_("Delete"))
{ {
_list_model = Gtk::ListStore::create (_list_model_columns); _list_model = Gtk::ListStore::create (_list_model_columns);
@ -292,7 +292,7 @@ BundleManager::BundleManager (Session& session)
_tree_view.append_column (_("Name"), _list_model_columns.name); _tree_view.append_column (_("Name"), _list_model_columns.name);
_tree_view.set_headers_visible (false); _tree_view.set_headers_visible (false);
boost::shared_ptr<BundleList> bundles = _session.bundles (); boost::shared_ptr<BundleList> bundles = _session->bundles ();
for (BundleList::iterator i = bundles->begin(); i != bundles->end(); ++i) { for (BundleList::iterator i = bundles->begin(); i != bundles->end(); ++i) {
add_bundle (*i); add_bundle (*i);
} }
@ -352,7 +352,7 @@ BundleManager::new_clicked ()
/* Start off with a single channel */ /* Start off with a single channel */
b->add_channel ("1"); b->add_channel ("1");
_session.add_bundle (b); _session->add_bundle (b);
add_bundle (b); add_bundle (b);
BundleEditor e (_session, b); BundleEditor e (_session, b);
@ -376,7 +376,7 @@ BundleManager::delete_clicked ()
Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected(); Gtk::TreeModel::iterator i = _tree_view.get_selection()->get_selected();
if (i) { if (i) {
boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle]; boost::shared_ptr<UserBundle> b = (*i)[_list_model_columns.bundle];
_session.remove_bundle (b); _session->remove_bundle (b);
_list_model->erase (i); _list_model->erase (i);
} }
} }

View file

@ -35,7 +35,7 @@ namespace ARDOUR {
class BundleEditorMatrix : public PortMatrix class BundleEditorMatrix : public PortMatrix
{ {
public: public:
BundleEditorMatrix (Gtk::Window *, ARDOUR::Session &, boost::shared_ptr<ARDOUR::Bundle>); BundleEditorMatrix (Gtk::Window *, ARDOUR::Session *, boost::shared_ptr<ARDOUR::Bundle>);
void set_state (ARDOUR::BundleChannel c[2], bool s); void set_state (ARDOUR::BundleChannel c[2], bool s);
PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const; PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const;
@ -67,7 +67,7 @@ class BundleEditorMatrix : public PortMatrix
class BundleEditor : public ArdourDialog class BundleEditor : public ArdourDialog
{ {
public: public:
BundleEditor (ARDOUR::Session &, boost::shared_ptr<ARDOUR::UserBundle>); BundleEditor (ARDOUR::Session *, boost::shared_ptr<ARDOUR::UserBundle>);
protected: protected:
void on_map (); void on_map ();
@ -88,7 +88,7 @@ class BundleEditor : public ArdourDialog
class BundleManager : public ArdourDialog class BundleManager : public ArdourDialog
{ {
public: public:
BundleManager (ARDOUR::Session &); BundleManager (ARDOUR::Session *);
private: private:
@ -115,7 +115,7 @@ class BundleManager : public ArdourDialog
Gtk::TreeView _tree_view; Gtk::TreeView _tree_view;
Glib::RefPtr<Gtk::ListStore> _list_model; Glib::RefPtr<Gtk::ListStore> _list_model;
ModelColumns _list_model_columns; ModelColumns _list_model_columns;
ARDOUR::Session& _session; ARDOUR::Session* _session;
Gtk::Button edit_button; Gtk::Button edit_button;
Gtk::Button delete_button; Gtk::Button delete_button;
}; };

View file

@ -4682,7 +4682,7 @@ void
Editor::show_global_port_matrix (ARDOUR::DataType t) Editor::show_global_port_matrix (ARDOUR::DataType t)
{ {
if (_global_port_matrix[t] == 0) { if (_global_port_matrix[t] == 0) {
_global_port_matrix[t] = new GlobalPortMatrixWindow (*session, t); _global_port_matrix[t] = new GlobalPortMatrixWindow (session, t);
} }
_global_port_matrix[t]->show (); _global_port_matrix[t]->show ();

View file

@ -31,7 +31,7 @@
using namespace std; using namespace std;
GlobalPortMatrix::GlobalPortMatrix (Gtk::Window* p, ARDOUR::Session& s, ARDOUR::DataType t) GlobalPortMatrix::GlobalPortMatrix (Gtk::Window* p, ARDOUR::Session* s, ARDOUR::DataType t)
: PortMatrix (p, s, t) : PortMatrix (p, s, t)
{ {
setup_all_ports (); setup_all_ports ();
@ -55,8 +55,8 @@ GlobalPortMatrix::set_state (ARDOUR::BundleChannel c[2], bool s)
for (ARDOUR::Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) { for (ARDOUR::Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) { for (ARDOUR::Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) {
ARDOUR::Port* p = _session.engine().get_port_by_name (*i); ARDOUR::Port* p = _session->engine().get_port_by_name (*i);
ARDOUR::Port* q = _session.engine().get_port_by_name (*j); ARDOUR::Port* q = _session->engine().get_port_by_name (*j);
if (p) { if (p) {
if (s) { if (s) {
@ -73,9 +73,9 @@ GlobalPortMatrix::set_state (ARDOUR::BundleChannel c[2], bool s)
} else { } else {
/* two non-Ardour ports */ /* two non-Ardour ports */
if (s) { if (s) {
jack_connect (_session.engine().jack (), j->c_str(), i->c_str()); jack_connect (_session->engine().jack (), j->c_str(), i->c_str());
} else { } else {
jack_disconnect (_session.engine().jack (), j->c_str(), i->c_str()); jack_disconnect (_session->engine().jack (), j->c_str(), i->c_str());
} }
} }
} }
@ -85,6 +85,10 @@ GlobalPortMatrix::set_state (ARDOUR::BundleChannel c[2], bool s)
PortMatrixNode::State PortMatrixNode::State
GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const
{ {
if (_session == 0) {
return PortMatrixNode::NOT_ASSOCIATED;
}
ARDOUR::Bundle::PortList const & in_ports = c[IN].bundle->channel_ports (c[IN].channel); ARDOUR::Bundle::PortList const & in_ports = c[IN].bundle->channel_ports (c[IN].channel);
ARDOUR::Bundle::PortList const & out_ports = c[OUT].bundle->channel_ports (c[OUT].channel); ARDOUR::Bundle::PortList const & out_ports = c[OUT].bundle->channel_ports (c[OUT].channel);
if (in_ports.empty() || out_ports.empty()) { if (in_ports.empty() || out_ports.empty()) {
@ -96,15 +100,15 @@ GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const
for (ARDOUR::Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) { for (ARDOUR::Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) {
for (ARDOUR::Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) { for (ARDOUR::Bundle::PortList::const_iterator j = out_ports.begin(); j != out_ports.end(); ++j) {
ARDOUR::Port* p = _session.engine().get_port_by_name (*i); ARDOUR::Port* p = _session->engine().get_port_by_name (*i);
ARDOUR::Port* q = _session.engine().get_port_by_name (*j); ARDOUR::Port* q = _session->engine().get_port_by_name (*j);
if (!p && !q) { if (!p && !q) {
/* two non-Ardour ports; things are slightly more involved */ /* two non-Ardour ports; things are slightly more involved */
/* XXX: is this the easiest way to do this? */ /* XXX: is this the easiest way to do this? */
/* XXX: isn't this very inefficient? */ /* XXX: isn't this very inefficient? */
jack_client_t* jack = _session.engine().jack (); jack_client_t* jack = _session->engine().jack ();
jack_port_t* jp = jack_port_by_name (jack, i->c_str()); jack_port_t* jp = jack_port_by_name (jack, i->c_str());
if (jp == 0) { if (jp == 0) {
return PortMatrixNode::NOT_ASSOCIATED; return PortMatrixNode::NOT_ASSOCIATED;
@ -138,7 +142,7 @@ GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const
return PortMatrixNode::ASSOCIATED; return PortMatrixNode::ASSOCIATED;
} }
GlobalPortMatrixWindow::GlobalPortMatrixWindow (ARDOUR::Session& s, ARDOUR::DataType t) GlobalPortMatrixWindow::GlobalPortMatrixWindow (ARDOUR::Session* s, ARDOUR::DataType t)
: _port_matrix (this, s, t) : _port_matrix (this, s, t)
{ {
switch (t) { switch (t) {

View file

@ -29,7 +29,7 @@
class GlobalPortMatrix : public PortMatrix class GlobalPortMatrix : public PortMatrix
{ {
public: public:
GlobalPortMatrix (Gtk::Window*, ARDOUR::Session&, ARDOUR::DataType); GlobalPortMatrix (Gtk::Window*, ARDOUR::Session*, ARDOUR::DataType);
void setup_ports (int); void setup_ports (int);
@ -60,7 +60,7 @@ private:
class GlobalPortMatrixWindow : public Gtk::Window class GlobalPortMatrixWindow : public Gtk::Window
{ {
public: public:
GlobalPortMatrixWindow (ARDOUR::Session&, ARDOUR::DataType); GlobalPortMatrixWindow (ARDOUR::Session *, ARDOUR::DataType);
private: private:
void on_show (); void on_show ();

View file

@ -41,7 +41,7 @@
using namespace ARDOUR; using namespace ARDOUR;
using namespace Gtk; using namespace Gtk;
IOSelector::IOSelector (Gtk::Window* p, ARDOUR::Session& session, boost::shared_ptr<ARDOUR::IO> io) IOSelector::IOSelector (Gtk::Window* p, ARDOUR::Session* session, boost::shared_ptr<ARDOUR::IO> io)
: PortMatrix (p, session, io->default_type()) : PortMatrix (p, session, io->default_type())
, _io (io) , _io (io)
{ {
@ -67,6 +67,10 @@ IOSelector::IOSelector (Gtk::Window* p, ARDOUR::Session& session, boost::shared_
void void
IOSelector::setup_ports (int dim) IOSelector::setup_ports (int dim)
{ {
if (!_session) {
return;
}
_ports[dim].suspend_signals (); _ports[dim].suspend_signals ();
if (dim == _other) { if (dim == _other) {
@ -91,7 +95,7 @@ IOSelector::set_state (ARDOUR::BundleChannel c[2], bool s)
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) { 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) { for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
Port* f = _session.engine().get_port_by_name (*i); Port* f = _session->engine().get_port_by_name (*i);
if (!f) { if (!f) {
return; return;
} }
@ -120,7 +124,7 @@ IOSelector::get_state (ARDOUR::BundleChannel c[2]) const
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) { 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) { for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
Port* f = _session.engine().get_port_by_name (*i); Port* f = _session->engine().get_port_by_name (*i);
/* since we are talking about an IO, our ports should all have an associated Port *, /* since we are talking about an IO, our ports should all have an associated Port *,
so the above call should never fail */ so the above call should never fail */
@ -152,7 +156,7 @@ IOSelector::list_is_global (int dim) const
return (dim == _other); return (dim == _other);
} }
IOSelectorWindow::IOSelectorWindow (ARDOUR::Session& session, boost::shared_ptr<ARDOUR::IO> io, bool /*can_cancel*/) IOSelectorWindow::IOSelectorWindow (ARDOUR::Session* session, boost::shared_ptr<ARDOUR::IO> io, bool /*can_cancel*/)
: _selector (this, session, io) : _selector (this, session, io)
{ {
set_name ("IOSelectorWindow2"); set_name ("IOSelectorWindow2");
@ -209,7 +213,7 @@ IOSelectorWindow::io_name_changed (void* src)
set_title (title); set_title (title);
} }
PortInsertUI::PortInsertUI (Gtk::Window* parent, ARDOUR::Session& sess, boost::shared_ptr<ARDOUR::PortInsert> pi) PortInsertUI::PortInsertUI (Gtk::Window* parent, ARDOUR::Session* sess, boost::shared_ptr<ARDOUR::PortInsert> pi)
: input_selector (parent, sess, pi->input()) : input_selector (parent, sess, pi->input())
, output_selector (parent, sess, pi->output()) , output_selector (parent, sess, pi->output())
{ {
@ -235,7 +239,7 @@ PortInsertUI::finished (IOSelector::Result r)
} }
PortInsertWindow::PortInsertWindow (ARDOUR::Session& sess, boost::shared_ptr<ARDOUR::PortInsert> pi, bool can_cancel) PortInsertWindow::PortInsertWindow (ARDOUR::Session* sess, boost::shared_ptr<ARDOUR::PortInsert> pi, bool can_cancel)
: ArdourDialog ("port insert dialog"), : ArdourDialog ("port insert dialog"),
_portinsertui (this, sess, pi), _portinsertui (this, sess, pi),
ok_button (can_cancel ? _("OK"): _("Close")), ok_button (can_cancel ? _("OK"): _("Close")),

View file

@ -31,7 +31,7 @@ namespace ARDOUR {
class IOSelector : public PortMatrix class IOSelector : public PortMatrix
{ {
public: public:
IOSelector (Gtk::Window*, ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>); IOSelector (Gtk::Window*, ARDOUR::Session *, boost::shared_ptr<ARDOUR::IO>);
void set_state (ARDOUR::BundleChannel c[2], bool); void set_state (ARDOUR::BundleChannel c[2], bool);
PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const; PortMatrixNode::State get_state (ARDOUR::BundleChannel c[2]) const;
@ -73,7 +73,7 @@ class IOSelector : public PortMatrix
class IOSelectorWindow : public Gtk::Window class IOSelectorWindow : public Gtk::Window
{ {
public: public:
IOSelectorWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::IO>, bool can_cancel = false); IOSelectorWindow (ARDOUR::Session *, boost::shared_ptr<ARDOUR::IO>, bool can_cancel = false);
IOSelector& selector() { return _selector; } IOSelector& selector() { return _selector; }
@ -92,7 +92,7 @@ class IOSelectorWindow : public Gtk::Window
class PortInsertUI : public Gtk::HBox class PortInsertUI : public Gtk::HBox
{ {
public: public:
PortInsertUI (Gtk::Window*, ARDOUR::Session&, boost::shared_ptr<ARDOUR::PortInsert>); PortInsertUI (Gtk::Window*, ARDOUR::Session *, boost::shared_ptr<ARDOUR::PortInsert>);
void redisplay (); void redisplay ();
void finished (IOSelector::Result); void finished (IOSelector::Result);
@ -105,7 +105,7 @@ class PortInsertUI : public Gtk::HBox
class PortInsertWindow : public ArdourDialog class PortInsertWindow : public ArdourDialog
{ {
public: public:
PortInsertWindow (ARDOUR::Session&, boost::shared_ptr<ARDOUR::PortInsert>, bool can_cancel = false); PortInsertWindow (ARDOUR::Session *, boost::shared_ptr<ARDOUR::PortInsert>, bool can_cancel = false);
protected: protected:
void on_map (); void on_map ();

View file

@ -710,7 +710,7 @@ MixerStrip::edit_output_configuration ()
output = _route->output (); output = _route->output ();
} }
output_selector = new IOSelectorWindow (_session, output); output_selector = new IOSelectorWindow (&_session, output);
} }
if (output_selector->is_visible()) { if (output_selector->is_visible()) {
@ -724,7 +724,7 @@ void
MixerStrip::edit_input_configuration () MixerStrip::edit_input_configuration ()
{ {
if (input_selector == 0) { if (input_selector == 0) {
input_selector = new IOSelectorWindow (_session, _route->input()); input_selector = new IOSelectorWindow (&_session, _route->input());
} }
if (input_selector->is_visible()) { if (input_selector->is_visible()) {

View file

@ -238,10 +238,14 @@ PortGroupList::maybe_add_processor_to_list (
/** Gather bundles from around the system and put them in this PortGroupList */ /** Gather bundles from around the system and put them in this PortGroupList */
void void
PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups) PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
{ {
clear (); clear ();
if (session == 0) {
return;
}
boost::shared_ptr<PortGroup> bus (new PortGroup (_("Bus"))); boost::shared_ptr<PortGroup> bus (new PortGroup (_("Bus")));
boost::shared_ptr<PortGroup> track (new PortGroup (_("Track"))); boost::shared_ptr<PortGroup> track (new PortGroup (_("Track")));
boost::shared_ptr<PortGroup> system_mono (new PortGroup (_("System (mono)"))); boost::shared_ptr<PortGroup> system_mono (new PortGroup (_("System (mono)")));
@ -254,7 +258,7 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
the route's input/output and processor bundles together so that they the route's input/output and processor bundles together so that they
are presented as one bundle in the matrix. */ are presented as one bundle in the matrix. */
boost::shared_ptr<RouteList> routes = session.get_routes (); boost::shared_ptr<RouteList> routes = session->get_routes ();
for (RouteList::const_iterator i = routes->begin(); i != routes->end(); ++i) { for (RouteList::const_iterator i = routes->begin(); i != routes->end(); ++i) {
@ -309,7 +313,7 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
that UserBundles that offer the same ports as a normal bundle get priority that UserBundles that offer the same ports as a normal bundle get priority
*/ */
boost::shared_ptr<BundleList> b = session.bundles (); boost::shared_ptr<BundleList> b = session->bundles ();
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) { for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
if (boost::dynamic_pointer_cast<UserBundle> (*i) && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) { if (boost::dynamic_pointer_cast<UserBundle> (*i) && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
@ -338,8 +342,8 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
/* Ardour stuff */ /* Ardour stuff */
if (!inputs && _type == DataType::AUDIO) { if (!inputs && _type == DataType::AUDIO) {
ardour->add_bundle (session.the_auditioner()->output()->bundle()); ardour->add_bundle (session->the_auditioner()->output()->bundle());
ardour->add_bundle (session.click_io()->bundle()); ardour->add_bundle (session->click_io()->bundle());
} }
/* Now find all other ports that we haven't thought of yet */ /* Now find all other ports that we haven't thought of yet */
@ -347,14 +351,14 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
std::vector<std::string> extra_system; std::vector<std::string> extra_system;
std::vector<std::string> extra_other; std::vector<std::string> extra_other;
const char **ports = session.engine().get_ports ("", _type.to_jack_type(), inputs ? const char **ports = session->engine().get_ports ("", _type.to_jack_type(), inputs ?
JackPortIsInput : JackPortIsOutput); JackPortIsInput : JackPortIsOutput);
if (ports) { if (ports) {
int n = 0; int n = 0;
string client_matching_string; string client_matching_string;
client_matching_string = session.engine().client_name(); client_matching_string = session->engine().client_name();
client_matching_string += ':'; client_matching_string += ':';
while (ports[n]) { while (ports[n]) {

View file

@ -40,9 +40,8 @@ class PortMatrix;
class RouteBundle; class RouteBundle;
class PublicEditor; class PublicEditor;
/** A list of bundles and ports, grouped by some aspect of their /** A list of bundles grouped by some aspect of their type e.g. busses, tracks, system.
* type e.g. busses, tracks, system. Each group has 0 or more bundles * A group has 0 or more bundles.
* and 0 or more ports, where the ports are not in the bundles.
*/ */
class PortGroup : public sigc::trackable class PortGroup : public sigc::trackable
{ {
@ -62,7 +61,10 @@ public:
bool has_port (std::string const &) const; bool has_port (std::string const &) const;
/** The bundle list has changed in some way; a bundle has been added or removed, or the list cleared etc. */
sigc::signal<void> Changed; sigc::signal<void> Changed;
/** An individual bundle on our list has changed in some way */
sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged; sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged;
struct BundleRecord { struct BundleRecord {
@ -99,7 +101,7 @@ class PortGroupList : public sigc::trackable
void add_group (boost::shared_ptr<PortGroup>); void add_group (boost::shared_ptr<PortGroup>);
void add_group_if_not_empty (boost::shared_ptr<PortGroup>); void add_group_if_not_empty (boost::shared_ptr<PortGroup>);
void set_type (ARDOUR::DataType); void set_type (ARDOUR::DataType);
void gather (ARDOUR::Session &, bool, bool); void gather (ARDOUR::Session *, bool, bool);
PortGroup::BundleList const & bundles () const; PortGroup::BundleList const & bundles () const;
void clear (); void clear ();
void remove_bundle (boost::shared_ptr<ARDOUR::Bundle>); void remove_bundle (boost::shared_ptr<ARDOUR::Bundle>);
@ -122,7 +124,10 @@ class PortGroupList : public sigc::trackable
bool empty () const; bool empty () const;
/** The group list has changed in some way; a group has been added or removed, or the list cleared etc. */
sigc::signal<void> Changed; sigc::signal<void> Changed;
/** A bundle in one of our groups has changed */
sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged; sigc::signal<void, ARDOUR::Bundle::Change> BundleChanged;
private: private:

View file

@ -45,7 +45,7 @@ using namespace ARDOUR;
* @param session Our session. * @param session Our session.
* @param type Port type that we are handling. * @param type Port type that we are handling.
*/ */
PortMatrix::PortMatrix (Window* parent, Session& session, DataType type) PortMatrix::PortMatrix (Window* parent, Session* session, DataType type)
: Table (3, 3), : Table (3, 3),
_session (session), _session (session),
_parent (parent), _parent (parent),
@ -95,6 +95,13 @@ PortMatrix::~PortMatrix ()
delete _menu; delete _menu;
} }
/** Perform initial and once-only setup. This must be called by
* subclasses after they have set up _ports[] to at least some
* reasonable extent. Two-part initialisation is necessary because
* setting up _ports is largely done by virtual functions in
* subclasses.
*/
void void
PortMatrix::init () PortMatrix::init ()
{ {
@ -109,25 +116,44 @@ PortMatrix::init ()
_visible_ports[1] = *_ports[1].begin(); _visible_ports[1] = *_ports[1].begin();
} }
/* Signal handling is kind of split into two parts:
*
* 1. When _ports[] changes, we call setup(). This essentially sorts out our visual
* representation of the information in _ports[].
*
* 2. When certain other things change, we need to get our subclass to clear and
* re-fill _ports[], which in turn causes appropriate signals to be raised to
* hook into part (1).
*/
/* Part 1: the basic _ports[] change -> reset visuals */
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
/* watch for the content of _ports[] changing */ /* watch for the content of _ports[] changing */
_ports[i].Changed.connect (mem_fun (*this, &PortMatrix::setup)); _ports[i].Changed.connect (mem_fun (*this, &PortMatrix::setup));
/* and for bundles in _ports[] changing */ /* and for bundles in _ports[] changing */
_ports[i].BundleChanged.connect (mem_fun (*this, &PortMatrix::bundle_changed)); _ports[i].BundleChanged.connect (sigc::hide (mem_fun (*this, &PortMatrix::setup)));
} }
/* scrolling stuff */
_hscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::hscroll_changed)); _hscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::hscroll_changed));
_vscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::vscroll_changed)); _vscroll.signal_value_changed().connect (mem_fun (*this, &PortMatrix::vscroll_changed));
/* Part 2: notice when things have changed that require our subclass to clear and refill _ports[] */
/* watch for routes being added or removed */ /* watch for routes being added or removed */
_session.RouteAdded.connect (sigc::hide (mem_fun (*this, &PortMatrix::routes_changed))); _session->RouteAdded.connect (sigc::hide (mem_fun (*this, &PortMatrix::routes_changed)));
/* and also bundles */ /* and also bundles */
_session.BundleAdded.connect (sigc::hide (mem_fun (*this, &PortMatrix::setup_global_ports))); _session->BundleAdded.connect (sigc::hide (mem_fun (*this, &PortMatrix::setup_global_ports)));
/* and also ports */ /* and also ports */
_session.engine().PortRegisteredOrUnregistered.connect (mem_fun (*this, &PortMatrix::setup_all_ports)); _session->engine().PortRegisteredOrUnregistered.connect (mem_fun (*this, &PortMatrix::setup_global_ports));
_session->GoingAway.connect (mem_fun (*this, &PortMatrix::session_going_away));
reconnect_to_routes (); reconnect_to_routes ();
@ -143,7 +169,7 @@ PortMatrix::reconnect_to_routes ()
} }
_route_connections.clear (); _route_connections.clear ();
boost::shared_ptr<RouteList> routes = _session.get_routes (); boost::shared_ptr<RouteList> routes = _session->get_routes ();
for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
_route_connections.push_back ( _route_connections.push_back (
(*i)->processors_changed.connect (mem_fun (*this, &PortMatrix::route_processors_changed)) (*i)->processors_changed.connect (mem_fun (*this, &PortMatrix::route_processors_changed))
@ -476,6 +502,8 @@ PortMatrix::disassociate_all_on_channel (boost::weak_ptr<Bundle> bundle, uint32_
void void
PortMatrix::setup_global_ports () PortMatrix::setup_global_ports ()
{ {
ENSURE_GUI_THREAD (mem_fun (*this, &PortMatrix::setup_global_ports));
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
if (list_is_global (i)) { if (list_is_global (i)) {
setup_ports (i); setup_ports (i);
@ -486,7 +514,7 @@ PortMatrix::setup_global_ports ()
void void
PortMatrix::setup_all_ports () PortMatrix::setup_all_ports ()
{ {
if (_session.deletion_in_progress()) { if (_session->deletion_in_progress()) {
return; return;
} }
@ -504,9 +532,8 @@ PortMatrix::toggle_show_only_bundles ()
} }
_show_only_bundles = !_show_only_bundles; _show_only_bundles = !_show_only_bundles;
_body->setup ();
setup_scrollbars (); setup ();
queue_draw ();
} }
pair<uint32_t, uint32_t> pair<uint32_t, uint32_t>
@ -601,30 +628,20 @@ PortMatrix::add_channel_proxy (boost::weak_ptr<Bundle> w)
add_channel (b); add_channel (b);
} }
void
PortMatrix::bundle_changed (ARDOUR::Bundle::Change c)
{
if (c != Bundle::NameChanged) {
setup_all_ports ();
}
setup ();
}
void void
PortMatrix::setup_notebooks () PortMatrix::setup_notebooks ()
{ {
int const h_current_page = _hnotebook.get_current_page (); int const h_current_page = _hnotebook.get_current_page ();
int const v_current_page = _vnotebook.get_current_page (); int const v_current_page = _vnotebook.get_current_page ();
remove_notebook_pages (_hnotebook);
remove_notebook_pages (_vnotebook);
/* for some reason best known to GTK, erroneous switch_page signals seem to be generated /* for some reason best known to GTK, erroneous switch_page signals seem to be generated
when adding pages to notebooks, so ignore them */ when adding or removing pages to or from notebooks, so ignore them */
_ignore_notebook_page_selected = true; _ignore_notebook_page_selected = true;
remove_notebook_pages (_hnotebook);
remove_notebook_pages (_vnotebook);
for (PortGroupList::List::const_iterator i = _ports[_row_index].begin(); i != _ports[_row_index].end(); ++i) { for (PortGroupList::List::const_iterator i = _ports[_row_index].begin(); i != _ports[_row_index].end(); ++i) {
HBox* dummy = manage (new HBox); HBox* dummy = manage (new HBox);
dummy->show (); dummy->show ();
@ -728,3 +745,9 @@ PortMatrix::h_page_selected (GtkNotebookPage *, guint n)
queue_draw (); queue_draw ();
} }
} }
void
PortMatrix::session_going_away ()
{
_session = 0;
}

View file

@ -52,7 +52,7 @@ class PortMatrixBody;
class PortMatrix : public Gtk::Table class PortMatrix : public Gtk::Table
{ {
public: public:
PortMatrix (Gtk::Window*, ARDOUR::Session&, ARDOUR::DataType); PortMatrix (Gtk::Window*, ARDOUR::Session *, ARDOUR::DataType);
~PortMatrix (); ~PortMatrix ();
void set_type (ARDOUR::DataType); void set_type (ARDOUR::DataType);
@ -157,7 +157,7 @@ protected:
inputs and outputs should put outputs in list 0 and inputs in list 1. */ inputs and outputs should put outputs in list 0 and inputs in list 1. */
PortGroupList _ports[2]; PortGroupList _ports[2];
boost::shared_ptr<PortGroup> _visible_ports[2]; boost::shared_ptr<PortGroup> _visible_ports[2];
ARDOUR::Session& _session; ARDOUR::Session* _session;
private: private:
@ -174,12 +174,12 @@ private:
void toggle_show_only_bundles (); void toggle_show_only_bundles ();
bool on_scroll_event (GdkEventScroll *); bool on_scroll_event (GdkEventScroll *);
boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const; boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
void bundle_changed (ARDOUR::Bundle::Change);
void setup_notebooks (); void setup_notebooks ();
void remove_notebook_pages (Gtk::Notebook &); void remove_notebook_pages (Gtk::Notebook &);
void v_page_selected (GtkNotebookPage *, guint); void v_page_selected (GtkNotebookPage *, guint);
void h_page_selected (GtkNotebookPage *, guint); void h_page_selected (GtkNotebookPage *, guint);
void route_processors_changed (ARDOUR::RouteProcessorChange); void route_processors_changed (ARDOUR::RouteProcessorChange);
void session_going_away ();
Gtk::Window* _parent; Gtk::Window* _parent;

View file

@ -842,7 +842,7 @@ ProcessorBox::choose_send ()
is closed. is closed.
*/ */
IOSelectorWindow *ios = new IOSelectorWindow (_session, send->output(), true); IOSelectorWindow *ios = new IOSelectorWindow (&_session, send->output(), true);
ios->show_all (); ios->show_all ();
/* keep a reference to the send so it doesn't get deleted while /* keep a reference to the send so it doesn't get deleted while
@ -1503,7 +1503,7 @@ ProcessorBox::edit_processor (boost::shared_ptr<Processor> processor)
PortInsertWindow *io_selector; PortInsertWindow *io_selector;
if (port_insert->get_gui() == 0) { if (port_insert->get_gui() == 0) {
io_selector = new PortInsertWindow (_session, port_insert); io_selector = new PortInsertWindow (&_session, port_insert);
port_insert->set_gui (io_selector); port_insert->set_gui (io_selector);
} else { } else {

View file

@ -49,7 +49,7 @@ ReturnUI::ReturnUI (Gtk::Window* parent, boost::shared_ptr<Return> r, Session& s
_vbox.pack_start (_hbox, false, false, false); _vbox.pack_start (_hbox, false, false, false);
io = manage (new IOSelector (parent, se, r->output())); io = manage (new IOSelector (parent, &se, r->output()));
pack_start (_vbox, false, false); pack_start (_vbox, false, false);

View file

@ -301,13 +301,13 @@ RouteParams_UI::setup_io_frames()
cleanup_io_frames(); cleanup_io_frames();
// input // input
_input_iosel = new IOSelector (this, *session, _route->input()); _input_iosel = new IOSelector (this, session, _route->input());
_input_iosel->setup (); _input_iosel->setup ();
input_frame.add (*_input_iosel); input_frame.add (*_input_iosel);
input_frame.show_all(); input_frame.show_all();
// output // output
_output_iosel = new IOSelector (this, *session, _route->output()); _output_iosel = new IOSelector (this, session, _route->output());
_output_iosel->setup (); _output_iosel->setup ();
output_frame.add (*_output_iosel); output_frame.add (*_output_iosel);
output_frame.show_all(); output_frame.show_all();
@ -551,7 +551,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> insert)
} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (insert)) != 0) { } else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (insert)) != 0) {
PortInsertUI *portinsert_ui = new PortInsertUI (this, *session, port_insert); PortInsertUI *portinsert_ui = new PortInsertUI (this, session, port_insert);
cleanup_view(); cleanup_view();
_plugin_conn = port_insert->GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_going_away), _plugin_conn = port_insert->GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_going_away),

View file

@ -52,7 +52,7 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session& se)
_vbox.pack_start (_hbox, false, false, false); _vbox.pack_start (_hbox, false, false, false);
_vbox.pack_start (_panners, false, false); _vbox.pack_start (_panners, false, false);
io = manage (new IOSelector (parent, se, s->output())); io = manage (new IOSelector (parent, &se, s->output()));
pack_start (_vbox, false, false); pack_start (_vbox, false, false);

View file

@ -14,7 +14,7 @@ using namespace ARDOUR;
class OptionsPortMatrix : public PortMatrix class OptionsPortMatrix : public PortMatrix
{ {
public: public:
OptionsPortMatrix (Gtk::Window* parent, ARDOUR::Session& session) OptionsPortMatrix (Gtk::Window* parent, ARDOUR::Session* session)
: PortMatrix (parent, session, DataType::AUDIO) : PortMatrix (parent, session, DataType::AUDIO)
{ {
_port_group.reset (new PortGroup ("")); _port_group.reset (new PortGroup (""));
@ -26,12 +26,10 @@ public:
void setup_ports (int dim) void setup_ports (int dim)
{ {
cerr << _session.the_auditioner()->output()->n_ports() << "\n";
if (dim == OURS) { if (dim == OURS) {
_port_group->clear (); _port_group->clear ();
_port_group->add_bundle (_session.click_io()->bundle()); _port_group->add_bundle (_session->click_io()->bundle());
_port_group->add_bundle (_session.the_auditioner()->output()->bundle()); _port_group->add_bundle (_session->the_auditioner()->output()->bundle());
} else { } else {
_ports[OTHER].gather (_session, true, false); _ports[OTHER].gather (_session, true, false);
} }
@ -42,18 +40,18 @@ public:
Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel); Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel); Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
if (c[OURS].bundle == _session.click_io()->bundle()) { if (c[OURS].bundle == _session->click_io()->bundle()) {
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) { 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) { for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
Port* f = _session.engine().get_port_by_name (*i); Port* f = _session->engine().get_port_by_name (*i);
assert (f); assert (f);
if (s) { if (s) {
_session.click_io()->connect (f, *j, 0); _session->click_io()->connect (f, *j, 0);
} else { } else {
_session.click_io()->disconnect (f, *j, 0); _session->click_io()->disconnect (f, *j, 0);
} }
} }
} }
@ -65,11 +63,11 @@ public:
Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel); Bundle::PortList const & our_ports = c[OURS].bundle->channel_ports (c[OURS].channel);
Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel); Bundle::PortList const & other_ports = c[OTHER].bundle->channel_ports (c[OTHER].channel);
if (c[OURS].bundle == _session.click_io()->bundle()) { if (c[OURS].bundle == _session->click_io()->bundle()) {
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) { 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) { for (ARDOUR::Bundle::PortList::const_iterator j = other_ports.begin(); j != other_ports.end(); ++j) {
Port* f = _session.engine().get_port_by_name (*i); Port* f = _session->engine().get_port_by_name (*i);
assert (f); assert (f);
if (f->connected_to (*j)) { if (f->connected_to (*j)) {
@ -119,7 +117,7 @@ class ConnectionOptions : public OptionEditorBox
{ {
public: public:
ConnectionOptions (Gtk::Window* parent, ARDOUR::Session* s) ConnectionOptions (Gtk::Window* parent, ARDOUR::Session* s)
: _port_matrix (parent, *s) : _port_matrix (parent, s)
{ {
_box->pack_start (_port_matrix); _box->pack_start (_port_matrix);
} }