Ditched ghetto homebrew RTTI in favour of the real deal;

removed BridgeNode crap


git-svn-id: http://svn.drobilla.net/lad@58 a436a847-0d15-0410-975c-d299462d15a1
This commit is contained in:
dave 2006-06-19 00:32:15 +00:00
parent 73e305ce9a
commit dbb4315a2c
17 changed files with 34 additions and 290 deletions

View File

@ -1,159 +0,0 @@
/* This file is part of Om. Copyright (C) 2006 Dave Robillard.
*
* Om 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.
*
* Om 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 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.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "BridgeNode.h"
//#include "ClientBroadcaster.h"
#include "Plugin.h"
#include "Patch.h"
#include "Om.h"
#include "OmApp.h"
#include "Maid.h"
#include "Driver.h"
#include "PortInfo.h"
#include <cassert>
namespace Om {
template <typename T>
BridgeNode<T>::BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size)
: InternalNode(path,
(parent->parent_patch() == NULL || poly != parent->parent_patch()->poly()) ? 1 : poly,
//poly,
parent, srate, buffer_size),
m_driver_port(NULL),
m_listnode(NULL),
m_external_port(NULL)
{
//cerr << "Creating bridge node " << path << " - polyphony: " << m_poly << endl;
m_listnode = new ListNode<InternalNode*>(this);
}
template
BridgeNode<sample>::BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size);
template
BridgeNode<MidiMessage>::BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size);
template <typename T>
BridgeNode<T>::~BridgeNode()
{
delete m_driver_port;
}
template BridgeNode<sample>::~BridgeNode();
template BridgeNode<MidiMessage>::~BridgeNode();
template <typename T>
void
BridgeNode<T>::activate()
{
assert(om->template driver<T>() != NULL);
assert(m_external_port != NULL); // Derived classes must create this
assert(parent_patch() != NULL);
if (parent_patch()->parent() == NULL && om != NULL)
m_driver_port = om->template driver<T>()->create_port(m_external_port);
InternalNode::activate();
}
template <typename T>
void
BridgeNode<T>::deactivate()
{
if (m_is_added)
remove_from_patch();
InternalNode::deactivate();
if (m_driver_port != NULL) {
delete m_driver_port;
m_driver_port = NULL;
}
}
template <typename T>
void
BridgeNode<T>::add_to_patch()
{
assert(parent_patch() != NULL);
parent_patch()->add_bridge_node(m_listnode);
InternalNode::add_to_patch();
// Activate driver port now in the audio thread (not before when created, to avoid race issues)
if (m_driver_port != NULL)
m_driver_port->add_to_driver();
}
template <typename T>
void
BridgeNode<T>::remove_from_patch()
{
assert(parent_patch() != NULL);
if (m_is_added) {
if (m_driver_port != NULL)
m_driver_port->remove_from_driver();
ListNode<InternalNode*>* ln = NULL;
ln = parent_patch()->remove_bridge_node(this);
om->maid()->push(ln);
m_listnode = NULL;
}
InternalNode::remove_from_patch();
}
template <typename T>
void
BridgeNode<T>::set_path(const Path& new_path)
{
InternalNode::set_path(new_path);
m_external_port->set_path(new_path);
if (m_driver_port != NULL)
m_driver_port->set_name(path().c_str());
}
#if 0
template <typename T>
void
BridgeNode<T>::send_creation_messages(ClientInterface* client) const
{
InternalNode::send_creation_messages(client);
om->client_broadcaster()->send_new_port_to(client, m_external_port);
// Send metadata
for (map<string, string>::const_iterator i = metadata().begin(); i != metadata().end(); ++i)
om->client_broadcaster()->send_metadata_update_to(client, path(), (*i).first, (*i).second);
// Send control value (if necessary)
//if (m_external_port->port_info()->is_control())
// om->client_broadcaster()->send_control_change_to(client, path(),
// ((PortBase<sample>*)m_external_port)->buffer(0)->value_at(0));
}
#endif
} // namespace Om

View File

@ -1,90 +0,0 @@
/* This file is part of Om. Copyright (C) 2006 Dave Robillard.
*
* Om 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.
*
* Om 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 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.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef BRIDGENODE_H
#define BRIDGENODE_H
#include <string>
#include "InternalNode.h"
#include "PortBase.h"
using std::string;
template <typename T> class ListNode;
namespace Om {
class DriverPort;
namespace Shared {
class ClientInterface;
} using Shared::ClientInterface;
/** A Node to represent input/output Ports on a Patch.
*
* This node acts as both a Node and a Port (it is the only Node type that
* returns non-null for as_port()). The node is a normal Node in a Patch,
* the Port is a Port on that Patch (port->parent == node->parent).
*
* This class handles all DriverPort functionality as well (if this Node
* is on a top level Patch).
*
* Both input and output nodes are handled in this class.
*
* This node will force itself to monophonic (regardless of the poly parameter
* passed to constructor) if the parent of the patch it's representing a port
* on has a different polyphony than the patch (since connecting mismatched
* polyphonies is impossible).
*
* \ingroup engine
*/
template <typename T>
class BridgeNode : public InternalNode
{
public:
virtual ~BridgeNode();
Port* as_port() { return m_external_port; }
void activate();
void deactivate();
void add_to_patch();
void remove_from_patch();
//void send_creation_messages(ClientInterface* client) const;
void set_path(const Path& new_path);
protected:
// Disallow copies (undefined)
BridgeNode(const BridgeNode&);
BridgeNode& operator=(const BridgeNode&);
BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size);
/** Driver port, used if this is on a top level Patch */
DriverPort* m_driver_port;
ListNode<InternalNode*>* m_listnode;
PortBase<T>* m_external_port;
};
template class BridgeNode<sample>;
template class BridgeNode<MidiMessage>;
} // namespace Om
#endif // BRIDGENODE_H

View File

@ -1,7 +1,7 @@
SUBDIRS = tests
DIST_SUBDIRS = events
AM_CXXFLAGS = @JACK_CFLAGS@ @LOSC_CFLAGS@ @ALSA_CFLAGS@ @LASH_CFLAGS@ @SLV2_CFLAGS@ -I$(top_srcdir)/src/common -I$(top_srcdir)/src/libs/engine/events -fno-exceptions -fno-rtti
AM_CXXFLAGS = @JACK_CFLAGS@ @LOSC_CFLAGS@ @ALSA_CFLAGS@ @LASH_CFLAGS@ @SLV2_CFLAGS@ -I$(top_srcdir)/src/common -I$(top_srcdir)/src/libs/engine/events -fno-exceptions
MAINTAINERCLEANFILES = Makefile.in

View File

@ -54,8 +54,6 @@ public:
Node(OmObject* parent, const string& name) : OmObject(parent, name) {}
virtual ~Node() {}
Node* as_node() { return static_cast<Node*>(this); }
/** Activate this Node.
*
* This function will be called in a non-realtime thread before it is
@ -93,7 +91,7 @@ public:
virtual void dependants(List<Node*>* l) = 0;
/** The Patch this Node belongs to. */
virtual Patch* parent_patch() const = 0;
virtual Patch* parent_patch() const = 0;
/** Information about what 'plugin' this Node is an instance of.
* Not the best name - not all nodes come from plugins (ie Patch)

View File

@ -73,12 +73,13 @@ public:
virtual List<Node*>* dependants() { return _dependants; }
virtual void dependants(List<Node*>* l) { _dependants = l; }
Patch* parent_patch() const { return (_parent == NULL) ? NULL : _parent->as_patch(); }
virtual const Plugin* plugin() const { return _plugin; }
void set_path(const Path& new_path);
/** A node's parent is always a patch, so static cast should be safe */
Patch* parent_patch() const { return (Patch*)_parent; }
protected:
// Disallow copies (undefined)
NodeBase(const NodeBase&);

View File

@ -33,10 +33,13 @@ namespace Om {
void
ObjectSender::send_all(ClientInterface* client)
{
for (Tree<OmObject*>::iterator i = om->object_store()->objects().begin();
Patch* root = om->object_store()->find_patch("/");
assert(root);
send_patch(client, root);
/*for (Tree<OmObject*>::iterator i = om->object_store()->objects().begin();
i != om->object_store()->objects().end(); ++i)
if ((*i)->as_patch() != NULL && (*i)->parent() == NULL)
send_patch(client, (*i)->as_patch());
send_patch(client, (*i)->as_patch());*/
//(*i)->as_node()->send_creation_messages(client);
}
@ -88,12 +91,12 @@ ObjectSender::send_node(ClientInterface* client, const Node* node)
// perspective they don't even exist (just the ports they represent)
// FIXME: hack, these nodes probably shouldn't even exist in the
// engine anymore
if (const_cast<Node*>(node)->as_port()) { // bridge node if as_port() returns non-NULL
/*if (const_cast<Node*>(node)->as_port()) { // bridge node if as_port() returns non-NULL
// FIXME: remove this whole thing. shouldn't be any bridge nodes anymore
assert(false);
send_port(client, const_cast<Node*>(node)->as_port());
return;
}
}*/
const Plugin* const plugin = node->plugin();

View File

@ -33,7 +33,7 @@ Patch*
ObjectStore::find_patch(const Path& path)
{
OmObject* const object = find(path);
return (object == NULL) ? NULL : object->as_patch();
return dynamic_cast<Patch*>(object);
}
@ -43,7 +43,7 @@ Node*
ObjectStore::find_node(const Path& path)
{
OmObject* const object = find(path);
return (object == NULL) ? NULL : object->as_node();
return dynamic_cast<Node*>(object);
}
@ -53,7 +53,7 @@ Port*
ObjectStore::find_port(const Path& path)
{
OmObject* const object = find(path);
return (object == NULL) ? NULL : object->as_port();
return dynamic_cast<Port*>(object);
}

View File

@ -212,11 +212,12 @@ OmApp::deactivate()
return;
m_audio_driver->root_patch()->process(false);
m_audio_driver->root_patch()->deactivate();
for (Tree<OmObject*>::iterator i = m_object_store->objects().begin();
/*for (Tree<OmObject*>::iterator i = m_object_store->objects().begin();
i != m_object_store->objects().end(); ++i)
if ((*i)->as_node() != NULL && (*i)->as_node()->parent() == NULL)
(*i)->as_node()->deactivate();
(*i)->as_node()->deactivate();*/
if (m_midi_driver != NULL)
m_midi_driver->deactivate();

View File

@ -54,11 +54,6 @@ public:
virtual ~OmObject() {}
// Ghetto home-brew RTTI
virtual Patch* as_patch() { return NULL; }
virtual Node* as_node() { return NULL; }
virtual Port* as_port() { return NULL; }
OmObject* parent() const { return _parent; }
inline const string& name() const { return _name; }

View File

@ -51,8 +51,6 @@ public:
Patch(const string& name, size_t poly, Patch* parent, samplerate srate, size_t buffer_size, size_t local_poly);
virtual ~Patch();
Patch* as_patch() { return static_cast<Patch*>(this); }
void activate();
void deactivate();

View File

@ -43,10 +43,11 @@ class Port : public OmObject
public:
virtual ~Port() {}
Port* as_port() { return this; }
void add_to_store();
void remove_from_store();
/** A port's parent is always a node, so static cast should be safe */
Node* parent_node() const { return (Node*)_parent; }
/** Called once per process cycle */
virtual void prepare_buffers(size_t nframes) = 0;
@ -57,7 +58,6 @@ public:
virtual bool is_input() const = 0;
virtual bool is_output() const = 0;
Node* parent_node() const { return _parent->as_node(); }
bool is_sample() const { return false; }
size_t num() const { return _index; }
size_t poly() const { return _poly; }

View File

@ -74,7 +74,7 @@ CreatePatchEvent::pre_process()
m_patch = new Patch(m_path.name(), poly, m_parent, om->audio_driver()->sample_rate(), om->audio_driver()->buffer_size(), m_poly);
if (m_parent != NULL) {
m_parent->add_node(new ListNode<Node*>(m_patch->as_node()));
m_parent->add_node(new ListNode<Node*>(m_patch));
if (m_parent->process())
m_process_order = m_parent->build_process_order();

View File

@ -71,12 +71,8 @@ DestroyEvent::~DestroyEvent()
void
DestroyEvent::pre_process()
{
if (m_node == NULL) {
OmObject* const obj = om->object_store()->find_node(m_path);
if (obj != NULL && obj->as_node() != NULL)
m_node = obj->as_node();
}
if (m_node == NULL)
m_node = om->object_store()->find_node(m_path);
if (m_node != NULL && m_path != "/") {
assert(m_node->parent_patch() != NULL);
@ -92,11 +88,12 @@ DestroyEvent::pre_process()
}
// Create a recursive disconnect event for the parent port, if a bridge node
Port* parent_port = m_patch_listnode->elem()->as_port();
cerr << "FIXME: Destroy bridge\n";
/*Port* parent_port = m_patch_listnode->elem()->as_port();
if (parent_port != NULL) { // Bridge node
m_parent_disconnect_event = new DisconnectPortEvent(parent_port);
m_parent_disconnect_event->pre_process();
}
}*/
if (m_node->parent_patch()->process()) {
m_process_order = m_node->parent_patch()->build_process_order();

View File

@ -74,11 +74,11 @@ RenameEvent::pre_process()
}
// Renaming only works for Nodes and Patches (which are Nodes)
if (obj->as_node() == NULL) {
/*if (obj->as_node() == NULL) {
m_error = OBJECT_NOT_RENAMABLE;
QueuedEvent::pre_process();
return;
}
}*/
if (obj != NULL) {
obj->set_path(m_new_path);

View File

@ -80,11 +80,11 @@ SetPortValueEvent::post_process()
om->client_broadcaster()->send_control_change(m_port_path, m_val);
// Send patch port control change, if this is a bridge port
Port* parent_port = m_port->parent_node()->as_port();
/*Port* parent_port = m_port->parent_node()->as_port();
if (parent_port != NULL) {
assert(parent_port->type() == DataType::FLOAT);
om->client_broadcaster()->send_control_change(parent_port->path(), m_val);
}
}*/
} else if (m_error == PORT_NOT_FOUND) {
string msg = "Unable to find port ";

View File

@ -92,11 +92,11 @@ SetPortValueQueuedEvent::post_process()
om->client_broadcaster()->send_control_change(m_port_path, m_val);
// Send patch port control change, if this is a bridge port
Port* parent_port = m_port->parent_node()->as_port();
/*Port* parent_port = m_port->parent_node()->as_port();
if (parent_port != NULL) {
assert(parent_port->type() == DataType::FLOAT);
om->client_broadcaster()->send_control_change(parent_port->path(), m_val);
}
}*/
} else if (m_error == PORT_NOT_FOUND) {
string msg = "Unable to find port ";

View File

@ -1,4 +1,4 @@
AM_CXXFLAGS = -I$(top_srcdir)/src/common -fno-exceptions -fno-rtti
AM_CXXFLAGS = -I$(top_srcdir)/src/common
DIST_SUBDIRS = python supercollider