All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javax.media.Controller Maven / Gradle / Ivy

The newest version!
/*
 * @(#)Controller.java	1.65 98/03/28
 *
 * Copyright 1996-1998 by Sun Microsystems, Inc.,
 * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information
 * of Sun Microsystems, Inc. ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with Sun.
 */

package javax.media;

/**
 *
 * Controller, which extends Clock,
 * provides resource-allocation
 * state information, event generation, and a mechanism for obtaining objects
 * that provide additional control over a Controller.
 *
 * 

Controller life-cycle

* * * As a Clock, a Controller is always either * Started or Stopped. * However, Controller subdivides * Clock's Stopped state into five * resource-allocation phases: * Unrealized, Realizing, Realized, * Prefetching, and Prefetched. *

* * The motivation for these life-cycle states is to provide * programmatic control over potentially time-consuming operations. * For example, when a Controller is first constructed, it's in * the Unrealized state. * While Realizing, the Controller * 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 realize method allows an application to initiate this * potentially time-consuming process (Realizing) at an * appropriate time. * When a Controller is Realizing or Prefetching, * it will eventually transition to another state, such as Realized, * Prefetched, or even Unrealized. *

* Because a Controller is often in one state on its way to * another, its destination or target state is an integral part * of the Controller life-cycle. * You can query a Controller to determine both its * current state and its target state. *

* * A Controller typically moves from the Unrealized state * through Realizing to the Realized state, * then through Prefetching * to the Prefetched state, and finally on to the Started state. * When a Controller finishes because * the end of the media stream is reached, * its stop time is reached, * or the stop method is invoked, * the Controller moves from the Started state * back to Prefetched * or possibly back to Realized, ready to * repeat the cycle. *

* * To use a Controller, you set up parameters to * manage its movement through these life-cycle states and then * move it through the states using the Controller * state transition methods. * To keep track of the Controller's current state, * you monitor the state transition events that it posts when changing states. * *

State Transition Methods

* * A Controller has five methods that are used to induce * life-cycle state changes: * realize, prefetch, deallocate, * syncStart, and stop. * * To transition a Controller to the Realized, * Prefetched, or Started state, * you use the corresponding method: realize, * prefetch, or syncStart. The * deallocate and stop methods can change * a requested state transition or trigger a state change. *

* * The forward transition methods (realize, * prefetch, and syncStart) are executed * asynchronously and return immediately. * When the requested operation is complete, the Controller * posts a ControllerEvent * that indicates that the target state has been reached, * stop or deallocate has been invoked, or * that an error occurred. *

* * The deallocate, and stop methods can * change the target state and induce a transition back to * a previous state. For example, calling deallocate on * a Controller in the * Prefetching state will move it back to * Realized. These methods are synchronous. * * *

State Transition Events

* * A Controller often moves between states * in an asynchronous manner. * To facilitate the tracking of a Controller's state, * every time its state or target state changes, * the Controller is required to post a TransitionEvent that describes * its previous state, current state, and new target state. * By monitoring the Controller event stream, you can determine * exactly what a Controller is doing at any point in time. *

* * When one of the asynchronous forward state transition methods * completes, the Controller posts the appropriate TransitionEvent * or a ControllerErrorEvent indicating that * the Controller is no longer usable. * For more information about ControllerEvents, see the Controller Events section. *

* * To facilitate simple asynchronous method protocols, * a Controller 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 realize is called on a * Prefetching Controller, * a RealizeCompleteEvent * is immediately posted, even though the Controller remains * in the Prefetching state and the target state is still * Prefetched. * The method completion events always report the Controller's previous, * current, and target state at the time the event was posted. *

* * *

Controller States

* * This section describes the semantics of each of the Controller * states. * * *

Unrealized State

* A newly instanced Controller starts in * the Unrealized state. * An Unrealized Controller 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 Unrealized Controller does * not know enough to properly construct * a Clock. * Therefore, it is illegal to call the following methods * on an Unrealized Controller: *
    *
  • getTimeBase *
  • setTimeBase *
  • setMediaTime *
  • setRate *
  • setStopTime *
  • getStartLatency *
* * A NotRealizedError is thrown if any of these methods are called * on an Unrealized Controller. * *

Realizing and Realized States

* * A Controller is Realized when it has obtained * all of the information necessary for it to acquire the resources it needs * to function. * A Realizing Controller is in the process of * identifying the resources that it needs to acquire. * Realizing can be a resource and time-consuming process. * A Realizing Controller might have to communicate with * a server, read a file, or interact with a set of other objects. *

* * Although a Realized Controller does not have to acquire * any resources, a Realized Controller 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. *

* * Normally, a Controller moves from the Unrealized state * through Realizing and on to the Realized state. * After realize has been invoked on a Controller, the only way it can return * to the Unrealized state is if deallocate is * invoked before Realizing completes. * Once a Controller reaches the Realized state, it * never returns to the Unrealized state; it remains in one of four * states: Realized, Prefetching, Prefetched, or * Started. *

* *

Realize method

* The realize method executes asynchronously and completion * is signaled by a RealizeCompleteEvent or a * ControllerErrorEvent. *

* *

Prefetching and Prefetched States

* * Once Realized, a Controller 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 Controller * is in the Prefetching state. * When finished, it moves into the Prefetched state. * Over a Controller's lifetime, Prefetching might have to recur when certain methods are invoked. * For example, calling setMediaTime might cause a Player to be * Prefetched again before it is Started. *

* * Once a Controller is Prefetched, it is capable of starting as quickly * as is possible for that Controller. * Prefetching reduces the startup latency of a Controller to the minimum * possible value. (The startup latency is the value returned by getStartLatency.) *

* * Typically, a Controller moves from the Realized state through * Prefetching and on to the Prefetched state. * Once Prefetched, a Controller * remains Prefetched unless deallocate, syncStart * or a method that changes its state and * increases its startup latency is invoked, such as setMediaTime. * *

* * A Started Controller returns to the Prefetched * or Realized state when it stops. *

* *

Prefetch Method

* * The prefetch method is asynchronous and its completion is signaled * by a PrefetchCompleteEvent or a ControllerErrorEvent. * As a convenience, if prefetch is invoked before a * Controller has reached the Realized state, * an implicit realize is invoked by changing the target state * to Prefetched. * Both a RealizeCompleteEvent and a PrefetchCompleteEvent are * posted by the Controller as it * transitions to the Prefetched state. *

* * If a Controller is Prefetching and cannot obtain all of the * resources it needs to start, it posts a ResourceUnavailableEvent * instead of a PrefetchCompleteEvent. * This is a catastrophic error condition * from which the Controller cannot recover. * *

Started State

* * Once Prefetched, a Controller can enter the * Started state. A Started Controller's Clock is running and it is processing data. * A Controller returns to the Prefetched or Realized * state when it stops because it has reached its stop time, reached the end of the media, * or because the stop method was invoked. *

* * When the Controller moves from the Prefetched * to the Started state, it posts a StartEvent. * When it moves from the Started state to a stopped state, it posts a StopEvent. *

* * A Controller is a Clock; therefore, syncStart, * setTimeBase, setMediaTime, and setRate * are illegal when the Controller is in the Started state. *

* *

syncStart

* The only way to start a Controller is to call * syncStart. *

* * It is illegal to call syncStart unless the Controller * is in the Prefetched state. If syncStart is called before the Controller is Prefetched, * a NotPrefetchedError is thrown. * Player defines a start method that relaxes this * requirement. *

* * *

Freeing the Resources Used by a Controller

* * Deallocate is used to stop a Controller's resource consumption. For example, * when Applet.stop is called, deallocate should be called to free the resources that the Controller was using. * Deallocate stops any resource-consuming activity * and releases any exclusive-use resources that the Controller * has acquired. * Deallocate executes synchronously; * when deallocate returns, the resources have been released. *

* * If the Controller is Unrealized or Realizing, calling deallocate returns it to the * Unrealized state. * Otherwise, calling deallocate returns a Controller to the Realized state. * Regardless of the state that a Controller is in, * deallocate must relinquish any exclusive-use * system resources that it holds; * the only way to guarantee that a Controller is not holding * resources is to call the deallocate method. *

* * It is illegal to call deallocate on a Started Controller. * You must stop the Controller before * it can relinquish its resources. *

* * When deallocate is called, a Controller posts a special StopEvent, * DeallocateEvent. * *

Controller Events

* * Controller events asynchronously deliver * information about Controller state changes. * There are four kinds of notifications: * life-cycle transition, method acknowledgement, * state notification, and error notification. *

* * To receive events, an object must implement the ControllerListener * interface and use the addControllerListener method to register its interest in a Controller's events. * All Controller events are posted to each registered listener. *

* * The Controller event mechanism is extensible and * some Controllers define events other than * the ones described here. * For example, the DurationUpdateEvents that a Player posts * are ControllerEvents. * *

*
TransitionEvent *
* TransitionEvents are posted when a Controller's * current or target state changes. TransitionEvent * 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 EndOfMediaEvent), * or the particular transition that the event represents (such as * PrefetchCompleteEvent). *

* * In addition to being posted for state transitions, * the method acknowledgement events RealizeCompleteEvent, * PrefetchCompleteEvent, StartEvent, * DeallocateEvent, * and StopByRequestEvent are always posted to signify method * completion even if no transition has taken place. *

* *

* *
*
RealizeCompleteEvent *
* Posted when a Controller moves from * Realizing to the Realized state, * or when the realize method is invoked and the * Controller is already Realized. *
* *
PrefetchCompleteEvent *
* Posted when a Controller moves from Prefetching to * the Prefetched state, or when the prefetch method is * invoked and the Controller is already Prefetched. *
* *
StartEvent *
* Posted when a Controller moves from Prefetched to * Started. *

*

* *
StopEvent *
* Posted when a Controller moves backward. For example, when moving from Prefetched * to Realized or from Started to Prefetched. * The reason that a stop event occurs is often important; this information is provided through several subclasses * of StopEvent. *
* *
*
StopAtTimeEvent *
* Posted when a Controller changes state because it has reached * its stop time. *
* *
StopByRequestEvent *
* Posted when a Controller changes state because stop is invoked. * This event is also posted as an acknowledgement to stop requests. *
* *
DeallocateEvent *
* Posted when the deallocate method is invoked, indicating * a possible state change and the loss of exclusive-use resources. * The current state is either Unrealized or Realized. * This event doesn't always indicate a state change. For example, it is posted * even if deallocate is called on a Realized  * Controller. *
* *
EndOfMediaEvent *
* Posted when a Controller has reached the end of the media. *
* *
ControllerClosedEvent *
When a Controller closes it is no longer usable, * and it will post a ControllerClosedEvent. * Once this has happened method calls on the Controller * have undefined behavior. * A Controller will close for one of two reasons. Either * the close method was invoked on the Controller, or * an error has occurred. If a Controller is closed because the * close method was invoked, it posts a ControllerClosedEvent. * If an error occurs it posts one of the ControllerErrorEvents. *
*
*
* *
ControllerErrorEvent *
* This is the super class of all of the error events that can be posted * by a Controller. 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. *

* * When a ControllerErrorEvent is posted, it indicates a catastrophic * error from which the Controller cannot recover. There is no * recovery mechanism for a Controller once one of these events has * been posted. *

* *

*
ResourceUnavailableEvent *
* This error event is posted during Prefetching or Realizing * to indicate that the operation has failed because a required resource was * unavailable. *
* *
DataLostErrorEvent *
* This error event is posted when a Controller has lost data. *
*
InternalErrorEvent *
* This error event is posted when something goes * wrong with the Controller for an implementation-specific reason. * This usually indicates that there is a problem with the implementation. *
*
* *
Status Change Events *
* A small number of status changes occur * in a Controller where notification of the change is useful, * particularly for updating user interface components. * Notification of these changes is provided through three * ControllerEvents: *
* *
*
RateChangeEvent *
* Posted when the rate of a Controller changes. * *
StopTimeChangeEvent *
* Posted when the stop time of a Controller changes. * *
MediaTimeSetEvent *
* Posted when the media time has been set using * the setMediaTime method. * This event is not periodically posted as media time changes * due to normal Controller processing and Clock operation. *
* *
* *

Controls

* * A Control is an object that provides a way to * affect some aspect of a Controller's operation * in a specific way. * The Control interface provides access to a * GUI Component that is * specific to the particular Control. * For example, the GainControl interface provides a way * to display a GUI control that allows the user to change the volume. *

* * A Controller makes a collection of Controls * available that effect the Controller's behavior. * To access these Controls, you use the getControls * method, which returns an array of supported Controls. * If you know the full class or interface name of the Control * you want, you can use getControl. *

* * Since an application using a Controller might not know how * to use all of the Controls that a Controller * supports, it can make the functionality available to a user by * providing access to the Component for * the Control. *

* * @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.65, 98/03/28 */ public interface Controller extends Clock, Duration { /** * Returned by getStartLatency. */ public final static Time LATENCY_UNKNOWN = new Time(Long.MAX_VALUE); /** * Returned by getState. */ public final static int Unrealized = 100; /** * Returned by getState. */ public final static int Realizing = 200; /** * Returned by getState. */ public final static int Realized = 300; /** * Returned by getState. */ public final static int Prefetching = 400; /** * Returned by getState. */ public final static int Prefetched = 500; /** * Returned by getState. */ public final static int Started = 600; /** * Get the current state of this Controller. * The state is an integer constant as defined above. *

* Note: * A race condition can occur between * the return of this method and the execution of * a state changing method. * * @return The Controller's current state. */ public int getState(); /** * Get the current target state of this Controller. * The state is an integer constant as defined above. *

* Note: * A race condition can occur between * the return of this method and the execution of * a state changing method. * * @return The Controller's current target state. */ public int getTargetState(); /** * Construct the media dependent portions of the Controller. * This can require examining media data and might * take some time to complete. *

* The realize method puts the Controller into the Realizing state and returns immediately. * When realize is complete and the Controller is in the * Realized state, the Controller posts a * RealizeCompleteEvent. * */ public void realize(); /** * Process as much data as necessary * to reduce the Controller's start latency to the shortest possible time. * This typically requires examining media data and takes some * time to complete. *

* The prefetch method puts the Controller into the Prefetching state and returns immediately. * When Prefetching is complete and the Controller is in * the Prefetched state, the Controller posts * a PrefetchCompleteEvent. * */ public void prefetch(); /** * Abort the current operation and cease any activity that * consumes system resources. If a Controller is not yet * Realized, * it returns to the Unrealized state. Otherwise, the Controller * returns to the Realized state. *

* It is illegal to call deallocate on a Started Controller. * A ClockStartedError is thrown if deallocate * is called and the Controller is in the Started state. */ public void deallocate(); /** * * Release all resources and cease all activity. * The close method indicates that the Controller will * no longer be used, and the Controller can * shut itself down. * A ControllerClosedEvent is posted. * Methods invoked on a closed Controller * might throw errors. */ public void close(); /** * Get the Controller's 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. *

* * This method is useful for determining how far in advance the * syncStart method must be invoked to ensure * that media will be * rendered at the specified start time. *

* For a Controller that has a variable start latency, * the value returned represents the maximum possible * start latency. If you call getStartLatency on a Controller that isn't Prefetched * and getStartLatency returns LATENCY_UNKNOWN, calling * prefetch and then calling getStartLatency again after the Controller posts * a PrefetchCompleteEvent might * return a more accurate estimate. * If getStartLatency still returns LATENCY_UNKNOWN, * the start latency is indeterminate and you might not be able to use * syncStart to * synchronize the Controller with other Controllers. *

* Note: In most cases, the value returned by * getStartLatency will change once the * Controller is Prefetched. * * @return The time it will take before the first frame of media * can be presented. */ public Time getStartLatency(); /** * Get a list of the Control objects that * this Controller supports. * If there are no controls, an array of length zero * is returned. * * @return A list of Controller Controls. */ public Control[] getControls(); /** * Get the Control that supports the * class or interface specified. The full class * or interface name should be specified. * Null is returned if the Control * is not supported. * * @return Control for the class or interface * name. */ public Control getControl(String forName); /** * Specify a ControllerListener to which * this Controller will send events. * A Controller can have multiple * ControllerListeners. * * @param listener The listener to which the Controller * will post events. */ public void addControllerListener(ControllerListener listener); /** * Remove the specified listener from this Controller's * listener list. * * @param listener The listener that has been receiving events from this * Controller. */ public void removeControllerListener(ControllerListener listener); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy