/*
* SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.media;
//~--- non-JDK imports --------------------------------------------------------
import net.java.sip.communicator.util.*;
//~--- JDK imports ------------------------------------------------------------
import javax.media.*;
/**
* A utility class that provides utility functions when working with processors.
*
* @author Emil Ivov
* @author Ken Larson
*/
public class ProcessorUtility implements ControllerListener {
private Logger logger = Logger.getLogger(ProcessorUtility.class);
/**
* The object that we use for syncing when waiting for a processor
* to enter a specific state.
*/
private Object stateLock = new Object();
private boolean failed = false;
/**
* Default constructor, creates an instance of the of the Processor utility.
*/
public ProcessorUtility() {}
/**
* Returns the object that we use for syncing when waiting for a processor
* to enter a specific state.
* @return Integer
*/
private Object getStateLock() {
return stateLock;
}
/**
* Specifies whether the wait operation has failed or completed with
* success.
*
* @param failed true if waiting has failed and false otherwise.
*/
private void setFailed(boolean failed) {
this.failed = failed;
}
/**
* This method is called when an event is generated by a
* <code>Controller</code> that this listener is registered with. We use
* the event to notify all waiting on our lock and record success or
* failure.
*
* @param ce The event generated.
*/
public void controllerUpdate(ControllerEvent ce) {
// If there was an error during configure or
// realize, the processor will be closed
if (ce instanceof ControllerClosedEvent) {
if (ce instanceof ControllerErrorEvent) {
logger.warn("ControllerErrorEvent: " + ce);
} else {
logger.debug("ControllerClosedEvent: " + ce);
}
setFailed(true);
// All controller events, send a notification
// to the waiting thread in waitForState method.
}
if (ce instanceof ControllerEvent) {
synchronized (getStateLock()) {
getStateLock().notifyAll();
}
}
}
/**
* Waits until <tt>processor</tt> enters state and returns a boolean
* indicating success or failure of the operation.
*
* @param processor Processor
* @param state one of the Processor.XXXed sate vars
* @return boolean true if the state has been reached and false otherwise
*/
public synchronized boolean waitForState(Processor processor, int state)
{
processor.addControllerListener(this);
setFailed(false);
// Call the required method on the processor
if (state == Processor.Configured) {
processor.configure();
} else if (state == Processor.Realized) {
processor.realize();
}
// Wait until we get an event that confirms the
// success of the method, or a failure event.
// See StateListener inner class
while ((processor.getState() < state) &&!failed) {
synchronized (getStateLock()) {
try {
getStateLock().wait();
} catch (InterruptedException ie) {
return false;
}
}
}
return !failed;
}
}
//~ Formatted by Jindent --- http://www.jindent.com