/*
* @(#)Module.java 1.11 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media;
import javax.media.*;
import javax.media.Format;
/**
* A Module is a "black box" which does a part of the overall processing. <br>
* It might have InputConnectors from which it receives data.
* It might have OutputConnectors to which it transmits data.
* its properties are exposed via Java Beans compliant accessing methods
* (setXXX()/getXXX) <br>
* <i> getLatency(.) removed since it was not used</i>
* <center><h2>data transfer protocols</center></h2>
* We define four protocols of data transfer between Modules:
* <ul>
*
* <li><b>Push - Output Data Driven</b> the upstream Module runs in its own thread. The Module loops on
* its "process" method and when it finishes one frame it calls the writeReport() method it triggers a call in the
* downstream Module to its "process" method which is executed in the current thread. When The downstream Module
* finishes, it call its downstream Module, recursively. This is the natural protocol for capture.
*
* <br>Here is a sample call graph for a push protocol (Source is pushing data to the Drain).<br>
* <pre>
* Source.process calls MediaOutputConnector.getEmptyBuffer()
* Source.process puts buffer in the empty buffer container
* Source.process calls MediaOutputConnector.writeReport(true)
* MediaOutputConnector.writeReport calls Drain.connectorPushed.
* Drain.connectorPushed calls Drain.process
* Drain.process calls MediaInputConnector.getValidBuffer
* Drain.process proccesses the Buffer
* Drain.process calls MediaInputConnector.readReport
* </pre>
*
* <li><b>Safe - Buffer Driven</b> both the downstream Module and the upstream Module run in separate threads.
* Both the Modules loops on their "process" method and a call to either readReport() in the downstream Module
* or writeReport() in the upstream Module wakes the other thread, if it is not running. When one of the threads
* is blocked, it waits until it is wakened by the other thread. This is the natural protocol for multiple threads.
* </li>
* </ul>
* @see Control
* @see Connector
* @see InputConnector
* @see OutputConnector
*/
public interface Module extends javax.media.Controls {
/**
* Return an array of strings containing this Module's
* input connectors names (both connected and unconnected).
* If this Module contains no inputs an array of length zero
* is returned.
*
* @return list of input connectors as strings.
**/
public String[] getInputConnectorNames();
/**
* Return an array of strings containing this Module's
* output connectors names (both connected and unconnected).
* If this Module contains no outputs an array of length zero
* is returned.
*
* @return list of output connectors as strings.
**/
public String[] getOutputConnectorNames();
/**
* Return the specified input connector. Connectors and their names
* are typically constructed in the Module's constructor, but their construction
* can be delayed until the Player <b>Realizing</b> state.
* Returns null if the string doesn't match any of the Module's
* InputConnectors.
*
* @param connectorName the name of the connector.
* @return InputConnector associated with this name.
**/
public InputConnector getInputConnector(String connectorName);
/**
* Return the specified output connector. Connectors and their names
* are typically constructed in the Module's constructor.
* Returns null if the String doesn't match any of the Module's
* OutputConnectors.
*
* @param connectorName the name of the connector
* @return OutputConnector associated with this name.
**/
public OutputConnector getOutputConnector(String connectorName);
/**
* Each of the inputConnectors of this Module has to be
* registered with this function.
* This method also sets the Module reference of the Connector
**/
void registerInputConnector(String name, InputConnector in);
/**
* Each of the outputConnectors of this Module has to be
* registered with this function.
* This method also sets the Module reference of the Connector
**/
void registerOutputConnector(String name, OutputConnector out);
/**
* Return the Module to its initial state. <br>
* A Module should call its Connectors reset method, and then clear its
* internal buffers typically by calling the StateTransistor's method dealloc().
**/
public void reset();
/**
* A callback function denoting data was written to one of this Module input Connectors.
* This function is needed in case of <b>Push</b> protocol
* Typical reaction of the module is to process one frame in the calling thread and return.
*
* @param inputConnector the inputConnector of the connection which have received data.
**/
public void connectorPushed(InputConnector inputConnector) ;
/**
* returns the name of this Module in the Player
*/
public String getName();
/**
* sets the name of this Module. Called by the owning Player registerModule() method
*/
public void setName(String name);
/**
* Selects a format for the Connector (the default is null).
* The <b>setFormat()</b> method is typically called by the Manager
* as part of the Connector connection method call.
* Typically the connector would delegate this call to its owning Module.
**/
public void setFormat(Connector connector,Format format);
/**
* Specify a <code>ModuleListener</code> to which this <code>Module</code>
* will send events.
*
* @param listener The listener to which the <code>Module</code> will
* post events.
*/
public void setModuleListener(ModuleListener listener);
/**
* Query to see if the module has just been interrupted.
* @return true if the module has just been interrupted.
*/
public boolean isInterrupted();
/**
* Set the JMD debugger instance for the module to use.
*/
public void setJMD(JMD jmd);
}
|