/* 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 namespace Om { template BridgeNode::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(this); } template BridgeNode::BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size); template BridgeNode::BridgeNode(const string& path, size_t poly, Patch* parent, samplerate srate, size_t buffer_size); template BridgeNode::~BridgeNode() { delete m_driver_port; } template BridgeNode::~BridgeNode(); template BridgeNode::~BridgeNode(); template void BridgeNode::activate() { assert(om->template driver() != 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()->create_port(m_external_port); InternalNode::activate(); } template void BridgeNode::deactivate() { if (m_is_added) remove_from_patch(); InternalNode::deactivate(); if (m_driver_port != NULL) { delete m_driver_port; m_driver_port = NULL; } } template void BridgeNode::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 void BridgeNode::remove_from_patch() { assert(parent_patch() != NULL); if (m_is_added) { if (m_driver_port != NULL) m_driver_port->remove_from_driver(); ListNode* ln = NULL; ln = parent_patch()->remove_bridge_node(this); om->maid()->push(ln); m_listnode = NULL; } InternalNode::remove_from_patch(); } template void BridgeNode::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 void BridgeNode::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::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*)m_external_port)->buffer(0)->value_at(0)); } #endif } // namespace Om