/*
* @(#)Controller.java 1.7 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package javax.media;
/**
*
* The <code>Controller</code> interface, which extends <code>Clock</code>,
* provides resource-allocation
* state information, event generation, and a mechanism for obtaining objects
* that provide additional control over a <code>Controller</code>.
*
* <h2>Controller Life Cycle</h2>
*
*
* As a <code>Clock</code>, a <code>Controller</code> is always either
* <I>Started</I> or <I>Stopped</I>.
* However, <code>Controller</code> subdivides
* <code>Clock's</code> <I>Stopped</I> state into five
* resource-allocation phases:
* <i>Unrealized</i>, <i>Realizing</i>, <i>Realized</i>,
* <i>Prefetching</i>, and <i>Prefetched</i>.
* <p>
*
* The purpose of these life-cycle states is to provide
* programmatic control over potentially time-consuming operations.
* For example, when a <code>Controller</code> is first constructed, it's in
* the <i>Unrealized</i> state.
* While <I>Realizing</I>, the <code>Controller</code>
* performs the communication necessary to locate all of the resources
* it needs to function (such as communicating with a server,
* other controllers, or a file system).
* The <code>realize</code> method allows an application to initiate this
* potentially time-consuming process (<i>Realizing</i>) at an
* appropriate time.
* When a <code>Controller</code> is <i>Realizing</i> or <i>Prefetching</i>,
* it will eventually transition to another state, such as <i>Realized</i>,
* <i>Prefetched</i>, or even <i>Unrealized</i>.
* <p>
* Because a <code>Controller</code> is often in one state and on its way to
* another, its destination or <i>target</i> state is an integral part
* of the <code>Controller</code> life cycle.
* You can query a <code>Controller</code> to determine both its
* current state and its target state.
* <p>
*
* A <code>Controller</code> typically moves from the <i>Unrealized</i> state
* through <i>Realizing</i> to the <i>Realized</i> state,
* then through <i>Prefetching</i>
* to the <i>Prefetched</i> state, and finally on to the <i>Started</i> state.
* When a <code>Controller</code> finishes because
* the end of the media stream is reached,
* its stop time is reached,
* or the <code>stop</code> method is invoked,
* the <code>Controller</code> moves from the <i>Started</i> state
* back to <i>Prefetched</i>
* or possibly back to <i>Realized</i>, and is ready to
* repeat the cycle.
* <p>
*
* To use a <code>Controller</code>, you must set up parameters to
* manage its movement through these life-cycle states and then
* move it through the states using the <code>Controller</code>
* state transition methods.
* To keep track of the <code>Controller's</code> current state,
* you monitor the state transition events that it posts when changing states.
*
* <h3>State Transition Methods</h3>
*
* A <code>Controller</code> has five methods that are used to induce
* life cycle state changes:
* <code>realize</code>, <code>prefetch</code>, <code>deallocate</code>,
* <code>syncStart</code>, and <code>stop</code>.
*
* To transition a <code>Controller</code> to the <i>Realized</i>,
* <i>Prefetched</i>, or <i>Started</i> state,
* you use the corresponding method: <code>realize</code>,
* <code>prefetch</code>, or <code>syncStart</code>. The
* <code>deallocate</code> and <code>stop</code> methods can change
* a requested state transition or trigger a state change.
* <p>
*
* The forward transition methods (<code>realize</code>,
* <code>prefetch</code>, and <code>syncStart</code>) are executed
* asynchronously and return immediately.
* When the requested operation is complete, the <code>Controller</code>
* posts a <code>ControllerEvent</code>
* indicating that the target state has been reached,
* <code>stop</code> or <code>deallocate</code> has been invoked, or
* that an error has occurred.
* <p>
*
* The <code>deallocate</code> and <code>stop</code> methods can
* change the target state and induce a transition back to
* a previous state. For example, calling <code>deallocate</code> on
* a <code>Controller</code> in the
* <i>Prefetching</i> state will move it back to
* the <i>Realized</i> state. These methods are synchronous.
*
*
* <h3>State Transition Events</h3>
*
* A <code>Controller</code> often moves between states
* in an asynchronous manner.
* To facilitate the tracking of a <code>Controller's</code> state,
* every time its state or target state changes,
* the <code>Controller</code> is required to post a <code>TransitionEvent</code> that describes
* its previous state, current state, and new target state.
* By monitoring the <code>Controller</code> event stream, you can determine
* exactly what a <code>Controller</code> is doing at any point in time.
* <p>
*
* When one of the asynchronous forward state transition methods
* completes, the <code>Controller</code> posts the appropriate <code>TransitionEvent</code>
* or a <code>ControllerErrorEvent</code> indicating that
* the <code>Controller</code> is no longer usable.
* For more information about <code>ControllerEvents</code>, see the <a href="#CE"><I>Controller Events section</I></a>.
* <p>
*
* To facilitate simple asynchronous method protocols,
* a <code>Controller</code> always posts a method completion event
* when one of the asynchronous forward state transition methods is invoked, even
* if no state or target state change occurs.
* For example, if <code>realize</code> is called on a
* <i>Prefetching</i> <code>Controller</code>,
* a <code>RealizeCompleteEvent</code>
* is immediately posted, even though the <code>Controller</code> remains
* in the <i>Prefetching</i> state and the target state is still
* <i>Prefetched</i>.
* The method completion events always report the <code>Controller's</code> previous,
* current, and target state at the time the event was posted.
* <p>
*
*
* <h2>Controller States</h2>
*
* This section describes the semantics of each of the <code>Controller</code>
* states.
*
*
* <h3>Unrealized State</h3>
* A newly instanced <code>Controller</code> starts in
* the <i>Unrealized</i> state.
* An <i>Unrealized</i> <code>Controller</code> knows very little about its
* internals and does not have enough information to acquire all of the resources
* it needs to function.
* In particular, an <i>Unrealized</i> <code>Controller</code> does
* not know enough to properly construct
* a <code>Clock</code>.
* Therefore, it is illegal to call the following methods
* on an <i>Unrealized</i> <code>Controller</code>:
* <ul>
* <li> <CODE>getTimeBase</CODE>
* <li> <CODE>setTimeBase</CODE>
* <li> <CODE>setMediaTime</CODE>
* <li> <CODE>setRate</CODE>
* <li> <CODE>setStopTime</CODE>
* <li> <CODE>getStartLatency</CODE>
* </ul>
*
* A <code>NotRealizedError</code> is thrown if any of these methods are called
* on an <I>Unrealized</I> <CODE>Controller</CODE>.
*
* <h3>Realizing and Realized States</h3>
*
* A <code>Controller</code> is <i>Realized</i> when it has obtained
* all of the information necessary for it to acquire the resources it needs
* to function.
* A <i>Realizing</i> <code>Controller</code> is in the process of
* identifying the resources that it needs to acquire.
* <i>Realizing</i> can be a resource-consuming and time-consuming process.
* A <i>Realizing</i> <code>Controller</code> might have to communicate with
* a server, read a file, or interact with a set of objects.
* <p>
*
* Although a <i>Realized</i> <code>Controller</code> does not have to acquire
* any resources, a <i>Realized</i> <code>Controller</code> is likely to have
* acquired all of the resources it needs except those that imply exclusive use of a
* scarce system resource, such as an audio device or MPEG decoding hardware.
* <p>
*
* Normally, a <code>Controller</code> moves from the <i>Unrealized</i> state
* through <i>Realizing</i> and on to the <i>Realized</i> state.
* After <code>realize</code> has been invoked on a <code>Controller</code>, the only way it can return
* to the <i>Unrealized</i> state is if <code>deallocate</code> is
* invoked before <i>Realizing</i> is completed.
* Once a <code>Controller</code> reaches the <i>Realized</i> state, it
* never returns to the <i>Unrealized</i> state. It remains in one of four
* states: <i>Realized</i>, <i>Prefetching</i>, <i>Prefetched</i>, or
* <i>Started</i>.
* <p>
*
* <h4>Realize Method</h4>
* The <code>realize</code> method executes asynchronously and completion
* is signaled by a <code>RealizeCompleteEvent</code> or a
* <code>ControllerErrorEvent</code>.
* <p>
*
* <h3>Prefetching and Prefetched States</h3>
*
* Once <i>Realized</i>, a <code>Controller</code> might still need to
* perform a number of time-consuming tasks before it is ready to be started.
* For example, it might need to acquire scarce hardware resources,
* fill buffers with media data, or perform other start-up processing.
* While performing these tasks, the <code>Controller</code>
* is in the <i>Prefetching</i> state.
* When finished, it moves into the <i>Prefetched</i> state.
* Over a <code>Controller's</code> lifetime, <i>Prefetching</i> might have to recur when certain methods are invoked.
* For example, calling <code>setMediaTime</code> might cause a <code>Player</code> to be
* <i>Prefetched</i> again before it is <i>Started</i>.
* <p>
*
* Once a <code>Controller</code> is <i>Prefetched</i>, it is capable of starting as quickly
* as is possible for that <code>Controller</code>.
* <i>Prefetching</i> reduces the startup latency of a <code>Controller</code> to the minimum
* possible value. (The startup latency is the value returned by <code>getStartLatency</code>.)
* <p>
*
* Typically, a <code>Controller</code> moves from the <i>Realized</i> state through
* <i>Prefetching</i> and on to the <i>Prefetched</i> state.
* Once <i>Prefetched</i>, a <code>Controller</code>
* remains <i>Prefetched</i> unless <code>deallocate</code>, <code>syncStart</code>
* or a method such as <code>setMediaTime</code>, which changes its state and
* increases its startup latency, is invoked.
*
* <p>
*
* When a <i>Started</i> <code>Controller</code> stops, it returns to the <i>Prefetched</i>
* or <i>Realized</i> state.
* <p>
*
* <h4>Prefetch Method</h4>
*
* The <code>prefetch</code> method is asynchronous and its completion is signaled
* by a <code>PrefetchCompleteEvent</code> or a <code>ControllerErrorEvent</code>.
* As a convenience, if <code>prefetch</code> is invoked before a
* <code>Controller</code> has reached the <i>Realized</i> state,
* an implicit <code>realize</code> is invoked by changing the target state
* to <i>Prefetched</i>.
* Both a <code>RealizeCompleteEvent</code> and a <code>PrefetchCompleteEvent</code> are
* posted by the <code>Controller</code> as it
* transitions to the <I>Prefetched</I> state.
* <p>
*
* If a <code>Controller</code> is <i>Prefetching</i> and cannot obtain all of the
* resources it needs to start, it posts a <code>ResourceUnavailableEvent</code>
* instead of a <code>PrefetchCompleteEvent</code>.
* This is a catastrophic error condition
* from which the <code>Controller</code> cannot recover.
*
* <h3>Started State</h3>
*
* Once <i>Prefetched</i>, a <code>Controller</code> can enter the
* <i>Started</i> state. A <I>Started</I> <CODE>Controller's</CODE> <CODE>Clock</CODE> is running and is processing data.
* A <code>Controller</code> returns to the <i>Prefetched</i> or <i>Realized</i>
* state when it stops because it has either reached its stop time, reached the end of the media,
* or because the <code>stop</code> method was invoked.
* <p>
*
* When the <code>Controller</code> moves from the <i>Prefetched</i>
* to the <i>Started</i> state, it posts a <code>StartEvent</code>.
* When it moves from the <i>Started</i> state to a stopped state, it posts a <code>StopEvent</code>.
* <p>
*
* A <code>Controller</code> is a <code>Clock</code>; therefore, <code>syncStart</code>,
* <code>setTimeBase</code>, <code>setMediaTime</code>, and <code>setRate</code>
* are illegal when the <code>Controller</code> is in the <i>Started</i> state.
* <p>
*
* <h4>syncStart</h4>
* The only way to start a <code>Controller</code> is to call
* <code>syncStart</code>.
* <p>
*
* It is illegal to call <code>syncStart</code> unless the <code>Controller</code>
* is in the <i>Prefetched</i> state. If <code>syncStart</code> is called before the <code>Controller</code> is <I>Prefetched</I>,
* a <code>NotPrefetchedError</code> is thrown.
* <code>Player</code> defines a <code>start</code> method that relaxes this
* requirement.
* <p>
*
*
* <h3>Freeing the Resources Used by a Controller</h3>
*
* <code>Deallocate</code> is used to stop a <code>Controller's</code> resource consumption. For example,
* when <code>Applet.stop</code> is called, <code>deallocate</code> should be called to free the resources that were used by the <code>Controller</code>.
* <code>Deallocate</code> stops any resource-consuming activity
* and releases any exclusive-use resources that the <code>Controller</code>
* has acquired.
* <code>Deallocate</code> executes synchronously;
* when <code>deallocate</code> returns, the resources have been released.
* <p>
*
* If the <code>Controller</code> is <i>Unrealized</i> or <i>Realizing</i>, calling <code>deallocate</code> returns it to the
* <i>Unrealized</i> state.
* Otherwise, calling <code>deallocate</code> returns a <code>Controller</code> to the <i>Realized</i> state.
* Regardless of the state that a <code>Controller</code> is in,
* <code>deallocate</code> must relinquish any exclusive-use
* system resources that it holds;
* the only way to guarantee that a <code>Controller</code> is not holding
* resources is to call the <code>deallocate</code> method.
* <p>
*
* It is illegal to call <code>deallocate</code> on a <i>Started</i> <code>Controller</code>.
* You must stop the <code>Controller</code> before
* it can relinquish its resources.
* <p>
*
* When <code>deallocate</code> is called, a <code>Controller</code> posts a special <code>StopEvent</code>,
* <code>DeallocateEvent</code>.
*
* <a name="CE"><h2>Controller Events</h2></a>
*
* <code>Controller</code> events asynchronously deliver
* information about <code>Controller</code> state changes.
* There are four kinds of notifications:
* life cycle transition, method acknowledgement,
* state notification, and error notification.
* <p>
*
* To receive events, an object must implement the <code>ControllerListener</code>
* interface and use the <code>addControllerListener</code> method to register its interest in a <code>Controller's</code> events.
* All <code>Controller</code> events are posted to each registered listener.
* <p>
*
* The <code>Controller</code> event mechanism is extensible and
* some <code>Controllers</code> define events other than
* the ones described here.
* For example, the <code>DurationUpdateEvents</code> posted by a <code>Player</code>
* are <code>ControllerEvents</code>.
*
* <dl>
* <dt> <code>TransitionEvent</code>
* <dd>
* <code>TransitionEvents</code> are posted when a <code>Controller's</code>
* current or target state changes. <code>TransitionEvent</code>
* is subclassed to provide a small set of events
* that are posted for particular kinds of transitions that
* merit special interest. The class name of the event indicates
* either the reason that the event was posted
* (such as <code>EndOfMediaEvent</code>),
* or the particular transition representedby the event (such as
* <code>PrefetchCompleteEvent</code>).
* <p>
*
* In addition to being posted for state transitions,
* the method acknowledgement events <code>RealizeCompleteEvent</code>,
* <code>PrefetchCompleteEvent</code>, <code>StartEvent</code>,
* <code>DeallocateEvent</code>,
* and <code>StopByRequestEvent</code> are always posted to signify method
* completion even if no transition has taken place.
* <p>
*
* </dd>
*
* <dl>
* <dt> <code>RealizeCompleteEvent</code>
* <dd>
* Posted when a <code>Controller</code> moves from the
* <i>Realizing</i> to the <i>Realized</i> state,
* or when the <code>realize</code> method is invoked and the
* <code>Controller</code> is already <i>Realized</i>.
* </dd>
*
* <dt> <code>PrefetchCompleteEvent</code>
* <dd>
* Posted when a <code>Controller</code> moves from the <i>Prefetching</i> to
* the <i>Prefetched</i> state, or when the <code>prefetch</code> method is
* invoked and the <code>Controller</code> is already <i>Prefetched</i>.
* </dd>
*
* <dt> <code>StartEvent</code>
* <dd>
* Posted when a <code>Controller</code> moves from the <i>Prefetched</i> to
* the <i>Started</i> state.
* <p>
* </dd>
*
* <dt> <code>StopEvent</code>
* <dd>
* Posted when a <code>Controller</code> moves backwards, for example, when moving from <i>Prefetched</i>
* to <i>Realized</i> or from <i>Started</i> to <i>Prefetched</i>.
* The <i>reason</i> that a stop event occurs is often important; this information is provided through several subclasses
* of <code>StopEvent</code>.
* </dd>
*
* <dl>
* <dt> <code>StopAtTimeEvent</code>
* <dd>
* Posted when a <code>Controller</code> changes state because it has reached
* its stop time.
* </dd>
*
* <dt> <code>StopByRequestEvent</code>
* <dd>
* Posted when a <code>Controller</code> changes state because <code>stop</code> is invoked.
* This event is also posted as an acknowledgement to <code>stop</code> requests.
* </dd>
*
* <dt> <code>DeallocateEvent</code>
* <dd>
* Posted when the <code>deallocate</code> method is invoked, indicating
* a possible state change and the loss of exclusive-use resources.
* The current state is either <i>Unrealized</i> or <i>Realized</i>.
* This event doesn't always indicate a state change. For example, it is posted
* even if <code>deallocate</code> is called on a <i>Realized</i>
* <code>Controller</code>.
* </dd>
*
* <dt> <code>EndOfMediaEvent</code>
* <dd>
* Posted when a <code>Controller</code> has reached the end of the media.
* </dd>
*
* <dt> <CODE>ControllerClosedEvent</CODE>
* <dd> When a <CODE>Controller</CODE> closes it is no longer usable,
* and it will post a <CODE>ControllerClosedEvent</CODE>.
* Once this has happened, method calls on the <CODE>Controller</CODE>
* have undefined behavior.
* A <CODE>Controller</CODE> will close for one of two reasons; either
* the <CODE>close</CODE> method was invoked on the <CODE>Controller</CODE>, or
* an error has occurred. If a <CODE>Controller</CODE> is closed because the
* <CODE>close</CODE> method was invoked, it posts a <CODE>ControllerClosedEvent</CODE>.
* If an error occurs it posts one of the <CODE>ControllerErrorEvents</CODE>.
* </dd>
* </dl>
* </dl>
*
* <dt> <code>ControllerErrorEvent</code>
* <dd>
* This is the super class of all of the error events that can be posted
* by a <code>Controller</code>. While this event is rarely posted, you should watch
* for it when processing
* other error events--this is how you can detect implementation-specific
* error events.
* <p>
*
* When a <code>ControllerErrorEvent</code> is posted, it indicates a catastrophic
* error from which the <code>Controller</code> cannot recover. There is no
* recovery mechanism for a <code>Controller</code> once one of these events has
* been posted.
* <p>
*
* <dl>
* <dt> <code>ResourceUnavailableEvent</code>
* <dd>
* This error event is posted during <i>Prefetching</i> or <i>Realizing</i>
* to indicate that the operation failed because a required resource was
* unavailable.
* </dd>
*
* <dt> <code>DataLostErrorEvent</code>
* <dd>
* This error event is posted when a <code>Controller</code> has lost data.
* </dd>
* <dt> <code>InternalErrorEvent</code>
* <dd>
* This error event is posted when something goes
* wrong with the <code>Controller</code> for an implementation-specific reason.
* This usually indicates that there is a problem with the implementation.
* </dd>
* </dl>
*
* <dt> Status Change Events
* <dd>
* A small number of status changes occur
* in a <code>Controller</code> where notification of the change is useful,
* particularly for updating user interface components.
* Notification of these changes is provided through three
* <code>ControllerEvents</code>:
* </dd>
*
* <dl>
* <dt> <code>RateChangeEvent</code>
* <dd>
* Posted when the rate of a <code>Controller</code> changes.
*
* <dt> <code>StopTimeChangeEvent</code>
* <dd>
* Posted when the stop time of a <code>Controller</code> changes.
*
* <dt> <code>MediaTimeSetEvent</code>
* <dd>
* Posted when the media time has been set using
* the <code>setMediaTime</code> method.
* This event is <i>not</i> periodically posted when media time changes
* due to normal <code>Controller</code> processing and <code>Clock</code> operation.
* </dl>
*
* </dl>
*
* <h2>Controls</h2>
*
* A <code>Control</code> is an object that provides a way to
* affect some aspect of a Controller's operation
* in a specific way.
* The <code>Control</code> interface provides access to a
* GUI <code>Component</code> that is
* specific to the particular <code>Control</code>.
* For example, the <code>GainControl</code> interface provides a way
* to display a GUI control that allows the user to change the volume.
* <p>
*
* A <code>Controller</code> makes available a collection of <code>Controls</code>
* that influence the <code>Controller's</code> behavior.
* To access these <code>Controls</code>, use the <code>getControls</code>
* method, which returns an array of supported <code>Controls</code>.
* If you know the full class or interface name of the desired <code>Control</code>,
* you can use <code>getControl</code>.
* <p>
*
* Since an application using a <code>Controller</code> might not know how
* to use all of the <code>Controls</code> supported by a <code>Controller</code>,
* it can make the functionality available to a user by
* providing access to the <code>Component</code> for
* the <code>Control</code>.
* <p>
*
* @see Player
* @see Control
* @see ControllerListener
* @see ControllerEvent
* @see TransitionEvent
* @see RealizeCompleteEvent
* @see PrefetchCompleteEvent
* @see StartEvent
* @see StopEvent
* @see EndOfMediaEvent
* @see ControllerErrorEvent
* @see DataLostErrorEvent
* @see ResourceUnavailableEvent
* @see InternalErrorEvent
* @see RateChangeEvent
* @see MediaTimeSetEvent
* @see ClockStartedError
* @see NotRealizedError
*
* @version 1.1, 98/05/13
*/
public interface Controller extends Clock, Duration {
/**
* Returned by <CODE>getStartLatency</CODE>.
*/
public final static Time LATENCY_UNKNOWN = new Time(Long.MAX_VALUE);
/**
* Returned by <CODE>U</CODE>.
*/
public final static int Unrealized = 100;
/**
* Returned by <CODE>getState</CODE>.
*/
public final static int Realizing = 200;
/**
* Returned by <CODE>getState</CODE>.
*/
public final static int Realized = 300;
/**
* Returned by <CODE>getState</CODE>.
*/
public final static int Prefetching = 400;
/**
* Returned by <CODE>getState</CODE>.
*/
public final static int Prefetched = 500;
/**
* Returned by <CODE>getState</CODE>.
*/
public final static int Started = 600;
/**
* Gets the current state of this <code>Controller</code>.
* The state is an integer constant as defined above.
* <p>
* <B>Note:</B>
* A race condition can occur between
* the return of this method and the execution of
* a state changing method.
*
* @return The <code>Controller's</code> current state.
*/
public int getState();
/**
* Gets the current target state of this <code>Controller</code>.
* The state is an integer constant as defined above.
*<p>
* <B>Note:</B>
* A race condition can occur between
* the return of this method and the execution of
* a state changing method.
*
* @return The <code>Controller's</code> current target state.
*/
public int getTargetState();
/**
* Constructs the media dependent portions of the <code>Controller</code>.
* This may include examining media data and might
* take some time to complete.
* <p>
* The <code>realize</code> method puts the <code>Controller</code> into the <i>Realizing</i> state and returns immediately.
* When <code>realize</code> is complete and the <code>Controller</code> is in the
* <i>Realized</i> state, the <code>Controller</code> posts a
* <code>RealizeCompleteEvent</code>.
*
*/
public void realize();
/**
* Processes as much data as necessary
* to reduce the <CODE>Controller's</CODE> start latency to the shortest possible time.
* This typically involves examining media data and takes some
* time to complete.
* <p>
* The <code>prefetch</code> method puts the <code>Controller</code> into the <i>Prefetching</i> state and returns immediately.
* When <i>Prefetching</i> is complete and the <code>Controller</code> is in
* the <i>Prefetched</i> state, the <code>Controller</code> posts
* a <code>PrefetchCompleteEvent</code>.
*
*/
public void prefetch();
/**
* Aborts the current operation and cease any activity that
* consumes system resources. If a <code>Controller</code> is not yet
* <i>Realized</i>,
* it returns to the <i>Unrealized</i> state. Otherwise, the <code>Controller</code>
* returns to the <i>Realized</i> state.
* <p>
* It is illegal to call <code>deallocate</code> on a <i>Started</i> <code>Controller</code>.
* A <CODE>ClockStartedError</CODE> is thrown if <CODE>deallocate</CODE>
* is called and the <CODE>Controller</CODE> is in the <i>Started</i> state.
*/
public void deallocate();
/**
*
* Releases all resources and cease all activity.
* The <CODE>close</CODE> method indicates that the <code>Controller</code> will
* no longer be used and can
* shut itself down.
* A <code>ControllerClosedEvent</code> is posted.
* Methods invoked on a closed <code>Controller</code>
* might throw errors.
*/
public void close();
/**
* Gets the <code>Controller's</code> start latency in nanoseconds. The start latency represents a
* worst-case estimate of the amount of time it will take
* to present the first frame of data.
* <p>
*
* This method is useful for determining how far in advance the
* <code>syncStart</code> method must be invoked to ensure
* that media will be
* rendered at the specified start time.
* <p>
* For a <code>Controller</code> that has a variable start latency,
* the value returned represents the maximum possible
* start latency. If you call <code>getStartLatency</code> on a <CODE>Controller</CODE> that isn't <I>Prefetched</I>
* and <code>getStartLatency</code> returns <code>LATENCY_UNKNOWN</code>, calling
* <code>prefetch</code> and then calling <code>getStartLatency</code> again after the <code>Controller</code> posts
* a <code>PrefetchCompleteEvent</code> might
* return a more accurate estimate.
* If <code>getStartLatency</code> still returns <code>LATENCY_UNKNOWN</code>,
* the start latency is indeterminate and you might not be able to use
* <code>syncStart</code> to
* synchronize the <code>Controller</code> with other <code>Controllers</code>.
* <p>
* <b>Note</b>: In most cases, the value returned by
* <code>getStartLatency</code> will change once the
* <code>Controller</code> is <i>Prefetched</i>.
*
* @return The time it will take before the first frame of media
* can be presented.
*/
public Time getStartLatency();
/**
* Gets a list of the <code>Control</code> objects supported by
* this <code>Controller</code>.
* If there are no controls, an array of length zero
* is returned.
*
* @return A list of <code>Controller</code> <code>Controls</code>.
*/
public Control[] getControls();
/**
* Gets the <code>Control</code> that supports the specified
* class or interface. The full class
* or interface name should be specified.
* <code>Null</code> is returned if the <code>Control</code>
* is not supported.
*
* @return <code>Control</code> for the class or interface
* name.
*/
public Control getControl(String forName);
/**
* Specifies a <code>ControllerListener</code> to which
* this <code>Controller</code> will send events.
* A <code>Controller</code> can have multiple
* <code>ControllerListeners</code>.
*
* @param listener The listener to which the <CODE>Controller</CODE>
* will post events.
*/
public void addControllerListener(ControllerListener listener);
/**
* Removes the specified listener from this <code>Controller's</code>
* listener list.
*
* @param listener The listener that has been receiving events from this
* <code>Controller</code>.
*/
public void removeControllerListener(ControllerListener listener);
}
|