/*
* @(#)BasicInputConnector.java 1.8 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media;
import javax.media.*;
import javax.media.Buffer;
/**
* implementation of the inputConnector interface
*
*/
public class BasicInputConnector extends BasicConnector implements InputConnector {
/** the connected outputConnector**/
protected OutputConnector outputConnector=null;
private boolean reset = false;
/**
* Return the OutputConnector this InputConnector is connected
* to. If this Connector is unconnected return null.
*/
public OutputConnector getOutputConnector() {
return outputConnector;
}
public void reset() {
synchronized (circularBuffer) {
reset = true;
super.reset();
circularBuffer.notifyAll();
}
}
/**
* returns if there are valid Buffer objects in the Connector's queue.
*/
public boolean isValidBufferAvailable() {
return circularBuffer.canRead();
}
/**
* Get buffer object containing media.
*/
public Buffer getValidBuffer() {
// System.out.println(getClass().getName()+":: getValidBuffer");
switch (protocol) {
case ProtocolPush:
synchronized (circularBuffer) {
if ( !isValidBufferAvailable() && reset)
return null;
reset = false;
return (Buffer)circularBuffer.read();
}
case ProtocolSafe:
synchronized (circularBuffer ) {
reset = false;
while ( !reset && !isValidBufferAvailable() ) {
try {
circularBuffer.wait();
} catch (Exception e) {}
}
if (reset)
return null;
Buffer buffer = (Buffer)circularBuffer.read();
circularBuffer.notifyAll();
return buffer;
}
default:
throw new RuntimeException();
}
}
/**
* Sets the OutputConnector this InputConnector is connected
* to. This method is called by the connectTo() method of the OutputConnector.
*/
public void setOutputConnector(OutputConnector outputConnector) {
this.outputConnector=outputConnector;
}
/**
* Indicates the oldest Buffer object got from this Connector was used and can
* be "recycled" by the upstream Module.<br>
*/
public void readReport(){
// System.out.println(getClass().getName()+":: readReport");
switch ( protocol ) {
case ProtocolPush:
case ProtocolSafe:
synchronized (circularBuffer ) {
if (reset) return;
circularBuffer.readReport();
circularBuffer.notifyAll();
return;
}
default:
throw new RuntimeException();
}
}
}
|