/* * Copyright (c) 1999-2000, Eric Moon. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Connection.h (Cortex) // * PURPOSE // Represents a general connection between two media nodes. // // * NOTES 13aug99 // Connection is undergoing massive resimplification(TM). // 1) It's now intended to be stored and passed by value; synchronization // and reference issues are no more. // 2) It now refers to the participatory nodes by ID, not pointer. This // makes the nodes slightly more cumbersome to look up, but makes // Connection completely 'safe': an outdated instance doesn't contain // any dangerous information. // // * NOTES 29jul99 // 1) For completeness, a release() or disconnect() method would be nice. Problems? // 2) How will connections between 'external' nodes be denoted? For example, // the audioMixer->audioOutput connection must not be broken EVER. Other external // connections might be manually broken, but should be left alone when the // NodeManager quits (whereas all internal connections need to be removed by // the dtor.) This implies two flags: 'internal' and 'locked'... // // * HISTORY // e.moon 25jun99 Begun #ifndef __Connection_H__ #define __Connection_H__ #include #include #include #include "cortex_defs.h" __BEGIN_CORTEX_NAMESPACE class NodeManager; class NodeGroup; class NodeRef; class Connection { // rather incestuous set of classes we've got here... friend class NodeRef; friend class NodeManager; public: // *** types & constants enum flag_t { // connection should be removed automatically when the NodeManager // is destroyed INTERNAL = 1<<1, // connection must never be removed LOCKED = 1<<2 }; public: // *** dtor/user-level ctors virtual ~Connection(); Connection(); Connection( const Connection& clone); //nyi Connection& operator=( const Connection& clone); //nyi public: // *** accessors uint32 id() const { return m_id; } bool isValid() const { return m_sourceNode != media_node::null && m_destinationNode != media_node::null && !m_disconnected; } // changed 13aug99 media_node_id sourceNode() const { return m_sourceNode.node; } const media_source& source() const { return m_source; } const char* outputName() const { return m_outputName.String(); } // changed 13aug99 media_node_id destinationNode() const { return m_destinationNode.node; } const media_destination& destination() const { return m_destination; } const char* inputName() const { return m_inputName.String(); } const media_format& format() const { return m_format; } uint32 flags() const { return m_flags; } // input/output access [e.moon 14oct99] status_t getInput( media_input* outInput) const; status_t getOutput( media_output* outOutput) const; // hint access status_t getOutputHint( const char** outName, media_format* outFormat) const; status_t getInputHint( const char** outName, media_format* outFormat) const; const media_format& requestedFormat() const { return m_requestedFormat; } protected: // *** general ctor accessible to subclasses & // cortex::NodeManager // id must be non-0 Connection( uint32 id, media_node srcNode, const media_source& src, const char* outputName, media_node destNode, const media_destination& dest, const char* inputName, const media_format& format, uint32 flags); // if any information about the pre-connection (free) output format // is known, call this method. this info may be useful in // finding the output to re-establish the connection later on. void setOutputHint( const char* origName, const media_format& origFormat); // if any information about the pre-connection (free) input format // is known, call this method. this info may be useful in // finding the output to re-establish the connection later on. void setInputHint( const char* origName, const media_format& origFormat); // [e.moon 8dec99] void setRequestedFormat( const media_format& reqFormat); private: // *** members // info that may be useful for reconstituting a particular // connection later on. struct endpoint_hint { endpoint_hint(const char* _name, const media_format& _format) : name(_name), format(_format) {} BString name; media_format format; }; // waiting to die? bool m_disconnected; // unique connection ID uint32 m_id; // [e.moon 14oct99] now stores media_nodes // source/output info media_node m_sourceNode; media_source m_source; BString m_outputName; endpoint_hint* m_outputHint; // dest/input info media_node m_destinationNode; media_destination m_destination; BString m_inputName; endpoint_hint* m_inputHint; // connection format media_format m_format; // behaviour modification uint32 m_flags; // [e.moon 8dec99] initial requested format media_format m_requestedFormat; }; __END_CORTEX_NAMESPACE #endif /*__Connection_H__*/