Fixes for connecting directly from a patch input to a patch output
git-svn-id: http://svn.drobilla.net/lad@81 a436a847-0d15-0410-975c-d299462d15a1
This commit is contained in:
parent
10c7c54e92
commit
8a8cd140a7
|
@ -16,46 +16,72 @@
|
|||
|
||||
#include "ConnectionModel.h"
|
||||
#include "PortModel.h"
|
||||
#include "PatchModel.h"
|
||||
|
||||
namespace LibOmClient {
|
||||
|
||||
|
||||
ConnectionModel::ConnectionModel(const Path& src_port, const Path& dst_port)
|
||||
: m_src_port_path(src_port),
|
||||
m_dst_port_path(dst_port),
|
||||
m_src_port(NULL),
|
||||
m_dst_port(NULL)
|
||||
: _src_port_path(src_port),
|
||||
_dst_port_path(dst_port),
|
||||
_src_port(NULL),
|
||||
_dst_port(NULL)
|
||||
{
|
||||
// Be sure connection is within one patch
|
||||
//assert(m_src_port_path.parent().parent()
|
||||
// == m_dst_port_path.parent().parent());
|
||||
//assert(_src_port_path.parent().parent()
|
||||
// == _dst_port_path.parent().parent());
|
||||
}
|
||||
|
||||
|
||||
ConnectionModel::ConnectionModel(CountedPtr<PortModel> src, CountedPtr<PortModel> dst)
|
||||
: _src_port_path(src->path()),
|
||||
_dst_port_path(dst->path()),
|
||||
_src_port(src),
|
||||
_dst_port(dst)
|
||||
{
|
||||
// Be sure connection is within one patch
|
||||
//assert(_src_port_path.parent().parent()
|
||||
// == _dst_port_path.parent().parent());
|
||||
}
|
||||
|
||||
|
||||
const Path&
|
||||
ConnectionModel::src_port_path() const
|
||||
{
|
||||
if (m_src_port == NULL)
|
||||
return m_src_port_path;
|
||||
if (!_src_port)
|
||||
return _src_port_path;
|
||||
else
|
||||
return m_src_port->path();
|
||||
return _src_port->path();
|
||||
}
|
||||
|
||||
|
||||
const Path&
|
||||
ConnectionModel::dst_port_path() const
|
||||
{
|
||||
if (m_dst_port == NULL)
|
||||
return m_dst_port_path;
|
||||
if (!_dst_port)
|
||||
return _dst_port_path;
|
||||
else
|
||||
return m_dst_port->path();
|
||||
return _dst_port->path();
|
||||
}
|
||||
|
||||
const Path
|
||||
ConnectionModel::patch_path() const
|
||||
{
|
||||
const Path& src_node = m_src_port_path.parent();
|
||||
const Path& dst_node = m_dst_port_path.parent();
|
||||
// Resolved
|
||||
if (_src_port && _dst_port) {
|
||||
// Direct connection from patch input to patch output (pass through)
|
||||
// (parent patch is parent of ports)
|
||||
if (_src_port->parent() == _dst_port->parent()) {
|
||||
CountedPtr<PatchModel> parent_patch = _src_port->parent();
|
||||
if (parent_patch)
|
||||
return parent_patch->path();
|
||||
}
|
||||
}
|
||||
|
||||
// Aside from the above special case, parent patch is parent of parent of ports
|
||||
|
||||
const Path& src_node = _src_port_path.parent();
|
||||
const Path& dst_node = _dst_port_path.parent();
|
||||
Path patch_path = src_node.parent();
|
||||
|
||||
if (src_node.parent() != dst_node.parent()) {
|
||||
|
|
|
@ -20,14 +20,14 @@
|
|||
|
||||
#include <string>
|
||||
#include "util/Path.h"
|
||||
#include "util/CountedPtr.h"
|
||||
#include "PortModel.h"
|
||||
#include <cassert>
|
||||
using std::string;
|
||||
using Om::Path;
|
||||
|
||||
namespace LibOmClient {
|
||||
|
||||
class PortModel;
|
||||
|
||||
|
||||
/** Class to represent a port->port connection in the engine.
|
||||
*
|
||||
|
@ -43,25 +43,26 @@ class ConnectionModel
|
|||
{
|
||||
public:
|
||||
ConnectionModel(const Path& src_port, const Path& dst_port);
|
||||
ConnectionModel(CountedPtr<PortModel> src, CountedPtr<PortModel> dst);
|
||||
|
||||
PortModel* src_port() const { return m_src_port; }
|
||||
PortModel* dst_port() const { return m_dst_port; }
|
||||
CountedPtr<PortModel> src_port() const { return _src_port; }
|
||||
CountedPtr<PortModel> dst_port() const { return _dst_port; }
|
||||
|
||||
void set_src_port(PortModel* port) { m_src_port = port; m_src_port_path = ""; }
|
||||
void set_dst_port(PortModel* port) { m_dst_port = port; m_dst_port_path = ""; }
|
||||
void set_src_port(CountedPtr<PortModel> port) { _src_port = port; _src_port_path = port->path(); }
|
||||
void set_dst_port(CountedPtr<PortModel> port) { _dst_port = port; _dst_port_path = port->path(); }
|
||||
|
||||
void src_port_path(const string& s) { m_src_port_path = s; }
|
||||
void dst_port_path(const string& s) { m_dst_port_path = s; }
|
||||
void src_port_path(const string& s) { _src_port_path = s; }
|
||||
void dst_port_path(const string& s) { _dst_port_path = s; }
|
||||
|
||||
const Path& src_port_path() const;
|
||||
const Path& dst_port_path() const;
|
||||
const Path patch_path() const;
|
||||
|
||||
private:
|
||||
Path m_src_port_path; ///< Only used if m_src_port == NULL
|
||||
Path m_dst_port_path; ///< Only used if m_dst_port == NULL
|
||||
PortModel* m_src_port;
|
||||
PortModel* m_dst_port;
|
||||
Path _src_port_path; ///< Only used if _src_port == NULL
|
||||
Path _dst_port_path; ///< Only used if _dst_port == NULL
|
||||
CountedPtr<PortModel> _src_port;
|
||||
CountedPtr<PortModel> _dst_port;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@ PatchModel::get_connection(const string& src_port_path, const string& dst_port_p
|
|||
|
||||
/** Add a connection to this patch.
|
||||
*
|
||||
* Ownership of @a cm is taken, it will be deleted along with this PatchModel.
|
||||
* A reference to @a cm is taken, released on deletion or removal.
|
||||
* If @a cm only contains paths (not pointers to the actual ports), the ports
|
||||
* will be found and set. The ports referred to not existing as children of
|
||||
* this patch is a fatal error.
|
||||
|
@ -177,28 +177,28 @@ PatchModel::add_connection(CountedPtr<ConnectionModel> cm)
|
|||
|
||||
NodeModel* src_node = (cm->src_port_path().parent() == path())
|
||||
? this : get_node(cm->src_port_path().parent().name()).get();
|
||||
PortModel* src_port = (src_node == NULL) ? NULL : src_node->get_port(cm->src_port_path().name()).get();
|
||||
CountedPtr<PortModel> src_port = src_node->get_port(cm->src_port_path().name());
|
||||
NodeModel* dst_node = (cm->dst_port_path().parent() == path())
|
||||
? this : get_node(cm->dst_port_path().parent().name()).get();
|
||||
PortModel* dst_port = (dst_node == NULL) ? NULL : dst_node->get_port(cm->dst_port_path().name()).get();
|
||||
CountedPtr<PortModel> dst_port = dst_node->get_port(cm->dst_port_path().name());
|
||||
|
||||
assert(src_port != NULL);
|
||||
assert(dst_port != NULL);
|
||||
assert(src_port);
|
||||
assert(dst_port);
|
||||
|
||||
// Find source port pointer to 'resolve' connection if necessary
|
||||
if (cm->src_port() != NULL)
|
||||
if (cm->src_port())
|
||||
assert(cm->src_port() == src_port);
|
||||
else
|
||||
cm->set_src_port(src_port);
|
||||
|
||||
// Find dest port pointer to 'resolve' connection if necessary
|
||||
if (cm->dst_port() != NULL)
|
||||
if (cm->dst_port())
|
||||
assert(cm->dst_port() == dst_port);
|
||||
else
|
||||
cm->set_dst_port(dst_port);
|
||||
|
||||
assert(cm->src_port() != NULL);
|
||||
assert(cm->dst_port() != NULL);
|
||||
assert(cm->src_port());
|
||||
assert(cm->dst_port());
|
||||
|
||||
m_connections.push_back(cm);
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ private:
|
|||
size_t m_poly;
|
||||
};
|
||||
|
||||
typedef map<string, PatchModel*> PatchModelMap;
|
||||
typedef map<string, CountedPtr<PatchModel> > PatchModelMap;
|
||||
|
||||
|
||||
} // namespace LibOmClient
|
||||
|
|
|
@ -95,7 +95,7 @@ Store::object(const string& path)
|
|||
return (*i).second;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
CountedPtr<PatchModel>
|
||||
Store::patch(const string& path)
|
||||
{
|
||||
|
@ -146,7 +146,7 @@ Store::port(const string& path)
|
|||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
Store::add_plugin(CountedPtr<PluginModel> pm)
|
||||
|
@ -345,11 +345,16 @@ Store::control_change_event(const string& port_path, float value)
|
|||
void
|
||||
Store::connection_event(const Path& src_port_path, const Path& dst_port_path)
|
||||
{
|
||||
// ConnectionModel has the clever patch-path-figuring-out stuff in it, so
|
||||
// just make one right away to get at that
|
||||
ConnectionModel* cm = new ConnectionModel(src_port_path, dst_port_path);
|
||||
CountedPtr<PortModel> src_port = object(src_port_path);
|
||||
CountedPtr<PortModel> dst_port = object(dst_port_path);
|
||||
|
||||
CountedPtr<PatchModel> patch = this->patch(cm->patch_path());
|
||||
assert(src_port);
|
||||
assert(dst_port);
|
||||
|
||||
CountedPtr<ConnectionModel> cm = new ConnectionModel(src_port, dst_port);
|
||||
|
||||
CountedPtr<PatchModel> patch = this->object(cm->patch_path());
|
||||
|
||||
if (patch)
|
||||
patch->add_connection(cm);
|
||||
else
|
||||
|
@ -366,7 +371,7 @@ Store::disconnection_event(const Path& src_port_path, const Path& dst_port_path)
|
|||
assert(src.parent().parent() == dst.parent().parent());
|
||||
const Path& patch_path = src.parent().parent();
|
||||
|
||||
CountedPtr<PatchModel> patch = this->patch(patch_path);
|
||||
CountedPtr<PatchModel> patch = this->object(patch_path);
|
||||
if (patch)
|
||||
patch->remove_connection(src, dst);
|
||||
else
|
||||
|
|
|
@ -43,9 +43,9 @@ class Store : public sigc::trackable { // FIXME: is trackable necessary?
|
|||
public:
|
||||
CountedPtr<PluginModel> plugin(const string& uri);
|
||||
CountedPtr<ObjectModel> object(const string& path);
|
||||
CountedPtr<PatchModel> patch(const string& path);
|
||||
/*CountedPtr<PatchModel> patch(const string& path);
|
||||
CountedPtr<NodeModel> node(const string& path);
|
||||
CountedPtr<PortModel> port(const string& path);
|
||||
CountedPtr<PortModel> port(const string& path);*/
|
||||
|
||||
size_t num_objects() { return m_objects.size(); }
|
||||
|
||||
|
|
|
@ -57,14 +57,11 @@ ObjectSender::send_patch(ClientInterface* client, const Patch* patch)
|
|||
send_node(client, node);
|
||||
}
|
||||
|
||||
for (List<Connection*>::const_iterator j = patch->connections().begin();
|
||||
j != patch->connections().end(); ++j)
|
||||
client->connection((*j)->src_port()->path(), (*j)->dst_port()->path());
|
||||
|
||||
// Send port information
|
||||
for (size_t i=0; i < patch->num_ports(); ++i) {
|
||||
Port* const port = patch->ports().at(i);
|
||||
|
||||
send_port(client, port);
|
||||
/*
|
||||
// Send metadata
|
||||
const map<string, string>& data = port->metadata();
|
||||
for (map<string, string>::const_iterator i = data.begin(); i != data.end(); ++i)
|
||||
|
@ -74,7 +71,15 @@ ObjectSender::send_patch(ClientInterface* client, const Patch* patch)
|
|||
if (port->type() == DataType::FLOAT && port->buffer_size() == 1)
|
||||
client->control_change(port->path(),
|
||||
dynamic_cast<TypedPort<sample>*>(port)->buffer(0)->value_at(0));
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
// Send connections
|
||||
for (List<Connection*>::const_iterator j = patch->connections().begin();
|
||||
j != patch->connections().end(); ++j)
|
||||
client->connection((*j)->src_port()->path(), (*j)->dst_port()->path());
|
||||
|
||||
|
||||
// Send metadata
|
||||
const map<string, string>& data = patch->metadata();
|
||||
|
|
|
@ -348,9 +348,11 @@ Patch::remove_port(const Port* port)
|
|||
Array<Node*>*
|
||||
Patch::build_process_order() const
|
||||
{
|
||||
cerr << "*********** BUILDING PROCESS ORDER FOR " << path() << endl;
|
||||
|
||||
Array<Node*>* const process_order = new Array<Node*>(_nodes.size());
|
||||
|
||||
// FIXME: tweak algorithm so it just ends up like this and save the iteration?
|
||||
// FIXME: tweak algorithm so it just ends up like this and save the cost of iteration?
|
||||
for (List<Node*>::const_iterator i = _nodes.begin(); i != _nodes.end(); ++i)
|
||||
(*i)->traversed(false);
|
||||
|
||||
|
|
|
@ -178,29 +178,33 @@ TypedConnectionEvent<T>::pre_process()
|
|||
Node* const src_node = m_src_port->parent_node();
|
||||
Node* const dst_node = m_dst_port->parent_node();
|
||||
|
||||
// Connection to a patch port from inside the patch
|
||||
if (src_node->parent_patch() != dst_node->parent_patch()) {
|
||||
// Connection to a patch port from inside the patch
|
||||
|
||||
assert(src_node->parent() == dst_node || dst_node->parent() == src_node);
|
||||
if (src_node->parent() == dst_node)
|
||||
m_patch = dynamic_cast<Patch*>(dst_node);
|
||||
else
|
||||
m_patch = dynamic_cast<Patch*>(src_node);
|
||||
|
||||
// Connection from a patch input to a patch output (pass through)
|
||||
} else if (src_node == dst_node && dynamic_cast<Patch*>(src_node)) {
|
||||
m_patch = dynamic_cast<Patch*>(src_node);
|
||||
|
||||
// Normal connection between nodes with the same parent
|
||||
} else {
|
||||
// Normal connection between nodes with the same parent
|
||||
m_patch = src_node->parent_patch();
|
||||
}
|
||||
|
||||
assert(m_patch);
|
||||
|
||||
if (src_node == NULL || dst_node == NULL) {
|
||||
cerr << "ERR 1\n";
|
||||
m_succeeded = false;
|
||||
QueuedEvent::pre_process();
|
||||
return;
|
||||
}
|
||||
|
||||
if (src_node->parent() != m_patch && dst_node->parent() != m_patch) {
|
||||
cerr << "ERR 2\n";
|
||||
if (m_patch != src_node && src_node->parent() != m_patch && dst_node->parent() != m_patch) {
|
||||
m_succeeded = false;
|
||||
QueuedEvent::pre_process();
|
||||
return;
|
||||
|
|
|
@ -224,7 +224,7 @@ ConnectWindow::gtk_callback()
|
|||
++stage;
|
||||
} else if (stage == 7) {
|
||||
if (Store::instance().num_objects() > 0) {
|
||||
CountedPtr<PatchModel> root = Store::instance().patch("/");
|
||||
CountedPtr<PatchModel> root = Store::instance().object("/");
|
||||
assert(root);
|
||||
PatchController* root_controller = new PatchController(root);
|
||||
root_controller->show_patch_window();
|
||||
|
|
|
@ -287,7 +287,7 @@ PatchWindow::breadcrumb_clicked(BreadCrumb* crumb)
|
|||
// FIXME: check to be sure PatchModel exists, then controller - maybe
|
||||
// even make a controller if there isn't one?
|
||||
PatchController* const pc = dynamic_cast<PatchController*>(
|
||||
Store::instance().patch(crumb->path())->controller());
|
||||
Store::instance().object(crumb->path())->controller());
|
||||
assert(pc != NULL);
|
||||
|
||||
if (pc == m_patch) {
|
||||
|
|
Loading…
Reference in New Issue